Added DMail support #5
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -190,3 +190,5 @@ $RECYCLE.BIN/
|
||||||
|
|
||||||
# End of https://www.toptal.com/developers/gitignore/api/windows,linux,goland+all,macos,go
|
# End of https://www.toptal.com/developers/gitignore/api/windows,linux,goland+all,macos,go
|
||||||
/.scannerwork/
|
/.scannerwork/
|
||||||
|
|
||||||
|
*.env
|
132
README.md
132
README.md
|
@ -1,65 +1,67 @@
|
||||||
# Go-e621 SDK
|
# Go-e621 SDK
|
||||||
|
|
||||||
An unofficial e621 SDK (Client) library to interact with **e621**, **e923** and **e6ai**. Maintained by the Anthrove Development Team.
|
An unofficial e621 SDK (Client) library to interact with **e621**, **e923** and **e6ai**. Maintained by the Anthrove Development Team.
|
||||||
|
|
||||||
- Caching?
|
- Caching?
|
||||||
- Auto pagination
|
- Auto pagination
|
||||||
- sync
|
- sync
|
||||||
- async
|
- async
|
||||||
- connected/inelegant calls
|
- connected/inelegant calls
|
||||||
- more docs
|
- more docs
|
||||||
|
|
||||||
# Completeness
|
# Completeness
|
||||||
|
|
||||||
_Legend_
|
_Legend_
|
||||||
|
|
||||||
| Symbol | Meaning |
|
| Symbol | Meaning |
|
||||||
|:------------------:|:----------------------|
|
|:------------------:|:----------------------|
|
||||||
| :x: | Not implemented |
|
| :x: | Not implemented |
|
||||||
| :heavy_minus_sign: | Partially implemented |
|
| :heavy_minus_sign: | Partially implemented |
|
||||||
| :heavy_check_mark: | Fully implemented |
|
| :heavy_check_mark: | Fully implemented |
|
||||||
|
|
||||||
_High Level API_
|
_High Level API_
|
||||||
|
|
||||||
| Area | Complete | Comment |
|
| Area | Complete | Comment |
|
||||||
|:-----------------|:------------------:|:--------|
|
|:-----------------|:------------------:|:--------|
|
||||||
| Authentication | :x: | |
|
| Authentication | :x: | |
|
||||||
| Posts | :heavy_minus_sign: | |
|
| Posts | :heavy_minus_sign: | |
|
||||||
| Tags | :heavy_minus_sign: | |
|
| Tags | :heavy_minus_sign: | |
|
||||||
| Tag aliases | :x: | |
|
| Tag aliases | :x: | |
|
||||||
| Tag implications | :x: | |
|
| Tag implications | :x: | |
|
||||||
| Notes | :x: | |
|
| Notes | :x: | |
|
||||||
| Pools | :x: | |
|
| Pools | :x: | |
|
||||||
| Users | :heavy_check_mark: | |
|
| Users | :heavy_check_mark: | |
|
||||||
| Favorites | :heavy_minus_sign: | |
|
| Favorites | :heavy_minus_sign: | |
|
||||||
| DB export | :x: | |
|
| DB export | :x: | |
|
||||||
|
|
||||||
_Mid Level API_
|
_Mid Level API_
|
||||||
|
|
||||||
| Area | Get | Set |
|
| Area | Get | Set |
|
||||||
|:-----------------|:------------------:|:----|
|
|:-----------------|:------------------:|:----|
|
||||||
| Authentication | :x: | |
|
| Authentication | :x: | |
|
||||||
| Posts | :heavy_check_mark: | |
|
| Posts | :heavy_check_mark: | |
|
||||||
| Tags | :heavy_check_mark: | |
|
| Tags | :heavy_check_mark: | |
|
||||||
| Tag aliases | :x: | |
|
| Tag aliases | :x: | |
|
||||||
| Tag implications | :x: | |
|
| Tag implications | :x: | |
|
||||||
| Notes | :heavy_check_mark: | |
|
| Notes | :heavy_check_mark: | |
|
||||||
| Pools | :heavy_check_mark: | |
|
| Pools | :heavy_check_mark: | |
|
||||||
| Users | :heavy_check_mark: | |
|
| Users | :heavy_check_mark: | |
|
||||||
| Favorites | :heavy_check_mark: | |
|
| Favorites | :heavy_check_mark: | |
|
||||||
| DB export | :x: |
|
| DB export | :x: |
|
||||||
|
| DMails | :heavy_minus_sign: | |
|
||||||
_Low Level API_
|
|
||||||
|
_Low Level API_
|
||||||
| Area | Get | Set |
|
|
||||||
|:-----------------|:------------------:|:----|
|
| Area | Get | Set |
|
||||||
| Authentication | :x: | |
|
|:-----------------|:------------------:|:----|
|
||||||
| Posts | :heavy_check_mark: | |
|
| Authentication | :x: | |
|
||||||
| Tags | :heavy_check_mark: | |
|
| Posts | :heavy_check_mark: | |
|
||||||
| Tag aliases | :x: | |
|
| Tags | :heavy_check_mark: | |
|
||||||
| Tag implications | :x: | |
|
| Tag aliases | :x: | |
|
||||||
| Notes | :heavy_check_mark: | |
|
| Tag implications | :x: | |
|
||||||
| Pools | :heavy_check_mark: | |
|
| Notes | :heavy_check_mark: | |
|
||||||
| Users | :heavy_check_mark: | |
|
| Pools | :heavy_check_mark: | |
|
||||||
| Favorites | :heavy_check_mark: | |
|
| Users | :heavy_check_mark: | |
|
||||||
| DB export | :x: | |
|
| Favorites | :heavy_check_mark: | |
|
||||||
|
| DB export | :x: | |
|
||||||
|
| DMails | :heavy_check_mark: | |
|
|
@ -1,53 +1,53 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
||||||
{
|
{
|
||||||
favorites, err := client.GetFavoritesForUser("selloo")
|
favorites, err := client.GetFavoritesForUser("selloo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
posts, err := favorites.Execute()
|
posts, err := favorites.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("URL of favorite post 0 is: %s", posts[0].File.URL)
|
log.Printf("URL of favorite post 0 is: %s", posts[0].File.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
favoritesBuilder, _ := client.GetFavoritesForUser("selloo")
|
favoritesBuilder, _ := client.GetFavoritesForUser("selloo")
|
||||||
favorites, err := client.GetNFavoritesForUser(10, favoritesBuilder)
|
favorites, err := client.GetNFavoritesForUser(10, favoritesBuilder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println(len(favorites))
|
log.Println(len(favorites))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
favoritesBuilder, _ := client.GetFavoritesForUser("selloo")
|
favoritesBuilder, _ := client.GetFavoritesForUser("selloo")
|
||||||
favorites, err := client.GetAllFavoritesForUser(favoritesBuilder)
|
favorites, err := client.GetAllFavoritesForUser(favoritesBuilder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Println(len(favorites))
|
log.Println(len(favorites))
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
favoritesWithTags := client.GetFavoritesForUserWithTags("selloo", "fennec male solo")
|
favoritesWithTags := client.GetFavoritesForUserWithTags("selloo", "fennec male solo")
|
||||||
posts, err := favoritesWithTags.Execute()
|
posts, err := favoritesWithTags.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("URL of favorite post 0 with tags is: %s", posts[0].File.URL)
|
log.Printf("URL of favorite post 0 with tags is: %s", posts[0].File.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,45 +1,45 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
||||||
|
|
||||||
posts, err := client.GetPosts().Execute()
|
posts, err := client.GetPosts().Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("Post 0 has following tags: %s", posts[0].Tags)
|
log.Printf("Post 0 has following tags: %s", posts[0].Tags)
|
||||||
|
|
||||||
postWithTags, err := client.GetPosts().Tags("fennec male solo order:score").Execute()
|
postWithTags, err := client.GetPosts().Tags("fennec male solo order:score").Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("Post 0 with tags has following ID: %d", postWithTags[0].ID)
|
log.Printf("Post 0 with tags has following ID: %d", postWithTags[0].ID)
|
||||||
|
|
||||||
post, err := client.GetPostByID(1337).Execute()
|
post, err := client.GetPostByID(1337).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("Post 1337 has following tags: %s", post.Tags)
|
log.Printf("Post 1337 has following tags: %s", post.Tags)
|
||||||
|
|
||||||
postBuilder := client.GetPosts()
|
postBuilder := client.GetPosts()
|
||||||
posts1, err := client.GetNPosts(600, postBuilder)
|
posts1, err := client.GetNPosts(600, postBuilder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Println(len(posts1))
|
log.Println(len(posts1))
|
||||||
|
|
||||||
postBuilder = client.GetPosts().Tags("how_to_dragon_your_train")
|
postBuilder = client.GetPosts().Tags("how_to_dragon_your_train")
|
||||||
posts, err = client.GetAllPosts(postBuilder)
|
posts, err = client.GetAllPosts(postBuilder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Println(len(posts))
|
log.Println(len(posts))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
client := e621.NewClient(os.Getenv("API_USER"), os.Getenv("API_KEY"))
|
||||||
user, err := client.GetUserByName("selloo").Execute()
|
user, err := client.GetUserByName("selloo").Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("User ID of user %s: %d ", user.Name, user.ID)
|
log.Printf("User ID of user %s: %d ", user.Name, user.ID)
|
||||||
|
|
||||||
user, err = client.GetUserByID(1337).Execute()
|
user, err = client.GetUserByID(1337).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Printf("User Name of user with ID %d: %s ", user.ID, user.Name)
|
log.Printf("User Name of user with ID %d: %s ", user.ID, user.Name)
|
||||||
}
|
}
|
||||||
|
|
65
example/lowlevel/dmail.go
Normal file
65
example/lowlevel/dmail.go
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
|
_ "github.com/joho/godotenv/autoload"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
requestContext := model.RequestContext{
|
||||||
|
Client: http.Client{},
|
||||||
|
Host: "https://e621.net",
|
||||||
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
|
Username: os.Getenv("API_USER"),
|
||||||
|
APIKey: os.Getenv("API_KEY"),
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Getting a DMail by ID:")
|
||||||
|
dmail, err := endpoints.GetDmail(requestContext, 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
} else {
|
||||||
|
log.Println(dmail.Body)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
|
||||||
|
log.Println("Deleting a DMail by ID:")
|
||||||
|
err = endpoints.DeleteDmail(requestContext, 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
|
||||||
|
log.Println("Marking a DMail as read by ID:")
|
||||||
|
err = endpoints.MarkAsReadDmail(requestContext, 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
|
||||||
|
log.Println("Getting all DMails:")
|
||||||
|
query := map[string]string{
|
||||||
|
"limit": "5",
|
||||||
|
}
|
||||||
|
dmails, err := endpoints.GetAllDmails(requestContext, query)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
} else {
|
||||||
|
for _, dmail := range dmails {
|
||||||
|
log.Println(dmail.Body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
|
||||||
|
log.Println("Marking all DMails as read:")
|
||||||
|
err = endpoints.MarkAsReadAllDmails(requestContext)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
}
|
|
@ -1,60 +1,60 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting favorites from the API.
|
// Log: Getting favorites from the API.
|
||||||
log.Println("Getting favorites API user: ")
|
log.Println("Getting favorites API user: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving favorites.
|
// Define query parameters for retrieving favorites.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetFavorites function to retrieve favorite posts.
|
// Call the GetFavorites function to retrieve favorite posts.
|
||||||
posts, err := endpoints.GetFavorites(requestContext, query)
|
posts, err := endpoints.GetFavorites(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the first favorite post.
|
// Log the URL of the first favorite post.
|
||||||
log.Println(posts[0].File.URL)
|
log.Println(posts[0].File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting favorites for a specific user.
|
// Log: Getting favorites for a specific user.
|
||||||
log.Println("Getting favorites for user: ")
|
log.Println("Getting favorites for user: ")
|
||||||
|
|
||||||
// Update the query parameters to include a specific user's ID.
|
// Update the query parameters to include a specific user's ID.
|
||||||
query = map[string]string{
|
query = map[string]string{
|
||||||
"user_id": "25483", // Replace with the desired user's ID
|
"user_id": "25483", // Replace with the desired user's ID
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetFavorites function to retrieve favorite posts for the specified user.
|
// Call the GetFavorites function to retrieve favorite posts for the specified user.
|
||||||
posts, err = endpoints.GetFavorites(requestContext, query)
|
posts, err = endpoints.GetFavorites(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the first favorite post.
|
// Log the URL of the first favorite post.
|
||||||
log.Println(posts[0].File.URL)
|
log.Println(posts[0].File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single note.
|
// Log: Getting a single note.
|
||||||
log.Println("Getting single note: ")
|
log.Println("Getting single note: ")
|
||||||
|
|
||||||
// Specify the note ID for retrieval.
|
// Specify the note ID for retrieval.
|
||||||
noteID := "36957" // Replace with the desired note's ID.
|
noteID := "36957" // Replace with the desired note's ID.
|
||||||
|
|
||||||
// Call the GetNote function to retrieve the specified note.
|
// Call the GetNote function to retrieve the specified note.
|
||||||
note, err := endpoints.GetNote(requestContext, noteID)
|
note, err := endpoints.GetNote(requestContext, noteID)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the body of the retrieved note.
|
// Log the body of the retrieved note.
|
||||||
log.Println(note.Body)
|
log.Println(note.Body)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of notes.
|
// Log: Getting a list of notes.
|
||||||
log.Println("Getting a list of notes: ")
|
log.Println("Getting a list of notes: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving a list of notes.
|
// Define query parameters for retrieving a list of notes.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetNotes function to retrieve a list of notes based on the query parameters.
|
// Call the GetNotes function to retrieve a list of notes based on the query parameters.
|
||||||
notes, err := endpoints.GetNotes(requestContext, query)
|
notes, err := endpoints.GetNotes(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of notes retrieved.
|
// Log the number of notes retrieved.
|
||||||
log.Println(len(notes))
|
log.Println(len(notes))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single pool.
|
// Log: Getting a single pool.
|
||||||
log.Println("Getting single pool: ")
|
log.Println("Getting single pool: ")
|
||||||
|
|
||||||
// Specify the pool ID for retrieval.
|
// Specify the pool ID for retrieval.
|
||||||
poolID := "36957" // Replace with the desired pool's ID.
|
poolID := "36957" // Replace with the desired pool's ID.
|
||||||
|
|
||||||
// Call the GetPool function to retrieve the specified pool.
|
// Call the GetPool function to retrieve the specified pool.
|
||||||
pool, err := endpoints.GetPool(requestContext, poolID)
|
pool, err := endpoints.GetPool(requestContext, poolID)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the name of the retrieved pool.
|
// Log the name of the retrieved pool.
|
||||||
log.Println(pool.Name)
|
log.Println(pool.Name)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of pools.
|
// Log: Getting a list of pools.
|
||||||
log.Println("Getting a list of pools: ")
|
log.Println("Getting a list of pools: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving a list of pools.
|
// Define query parameters for retrieving a list of pools.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetPools function to retrieve a list of pools based on the query parameters.
|
// Call the GetPools function to retrieve a list of pools based on the query parameters.
|
||||||
pools, err := endpoints.GetPools(requestContext, query)
|
pools, err := endpoints.GetPools(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of pools retrieved.
|
// Log the number of pools retrieved.
|
||||||
log.Println(len(pools))
|
log.Println(len(pools))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single post.
|
// Log: Getting a single post.
|
||||||
log.Println("Getting single post: ")
|
log.Println("Getting single post: ")
|
||||||
|
|
||||||
// Specify the post ID for retrieval.
|
// Specify the post ID for retrieval.
|
||||||
postID := "4353480" // Replace with the desired post's ID.
|
postID := "4353480" // Replace with the desired post's ID.
|
||||||
|
|
||||||
// Call the GetPost function to retrieve the specified post.
|
// Call the GetPost function to retrieve the specified post.
|
||||||
post, err := endpoints.GetPost(requestContext, postID)
|
post, err := endpoints.GetPost(requestContext, postID)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the retrieved post.
|
// Log the URL of the retrieved post.
|
||||||
log.Println(post.File.URL)
|
log.Println(post.File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of posts.
|
// Log: Getting a list of posts.
|
||||||
log.Println("Getting a list of posts: ")
|
log.Println("Getting a list of posts: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving a list of posts.
|
// Define query parameters for retrieving a list of posts.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
||||||
posts, err := endpoints.GetPosts(requestContext, query)
|
posts, err := endpoints.GetPosts(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of posts retrieved.
|
// Log the number of posts retrieved.
|
||||||
log.Println(len(posts))
|
log.Println(len(posts))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,97 +1,97 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single tag.
|
// Log: Getting a single tag.
|
||||||
log.Println("Getting a single tag: ")
|
log.Println("Getting a single tag: ")
|
||||||
|
|
||||||
// Specify the tag ID for retrieval.
|
// Specify the tag ID for retrieval.
|
||||||
tagID := "1530" // Replace with the desired tag's ID.
|
tagID := "1530" // Replace with the desired tag's ID.
|
||||||
|
|
||||||
// Call the GetTag function to retrieve the specified tag.
|
// Call the GetTag function to retrieve the specified tag.
|
||||||
tag, err := endpoints.GetTag(requestContext, tagID)
|
tag, err := endpoints.GetTag(requestContext, tagID)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the name of the retrieved tag.
|
// Log the name of the retrieved tag.
|
||||||
log.Println(tag.Name)
|
log.Println(tag.Name)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of tags.
|
// Log: Getting a list of tags.
|
||||||
log.Println("Getting a list of tags: ")
|
log.Println("Getting a list of tags: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving a list of tags.
|
// Define query parameters for retrieving a list of tags.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetTags function to retrieve a list of tags based on the query parameters.
|
// Call the GetTags function to retrieve a list of tags based on the query parameters.
|
||||||
tagList, err := endpoints.GetTags(requestContext, query)
|
tagList, err := endpoints.GetTags(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of tags retrieved.
|
// Log the number of tags retrieved.
|
||||||
log.Println(len(tagList))
|
log.Println(len(tagList))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Searching for tags containing "cat."
|
// Log: Searching for tags containing "cat."
|
||||||
log.Println("Searching for tags containing 'cat': ")
|
log.Println("Searching for tags containing 'cat': ")
|
||||||
|
|
||||||
// Define query parameters for searching tags that match "cat."
|
// Define query parameters for searching tags that match "cat."
|
||||||
query = map[string]string{
|
query = map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
"search[name_matches]": "cat*",
|
"search[name_matches]": "cat*",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetTags function with the search query to retrieve matching tags.
|
// Call the GetTags function with the search query to retrieve matching tags.
|
||||||
tagList, err = endpoints.GetTags(requestContext, query)
|
tagList, err = endpoints.GetTags(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the retrieved tags.
|
// Log the retrieved tags.
|
||||||
log.Println(tagList)
|
log.Println(tagList)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Searching for tags with the category "artist."
|
// Log: Searching for tags with the category "artist."
|
||||||
log.Println("Searching for tags with the category 'artist': ")
|
log.Println("Searching for tags with the category 'artist': ")
|
||||||
|
|
||||||
// Define query parameters for searching tags in the "artist" category.
|
// Define query parameters for searching tags in the "artist" category.
|
||||||
query = map[string]string{
|
query = map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
"search[category]": "1",
|
"search[category]": "1",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetTags function with the category filter to retrieve artist tags.
|
// Call the GetTags function with the category filter to retrieve artist tags.
|
||||||
tagList, err = endpoints.GetTags(requestContext, query)
|
tagList, err = endpoints.GetTags(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the retrieved artist tags.
|
// Log the retrieved artist tags.
|
||||||
log.Println(tagList)
|
log.Println(tagList)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single user.
|
// Log: Getting a single user.
|
||||||
log.Println("Getting a single user: ")
|
log.Println("Getting a single user: ")
|
||||||
|
|
||||||
// Specify the username for retrieval.
|
// Specify the username for retrieval.
|
||||||
username := "selloo" // Replace with the desired username.
|
username := "selloo" // Replace with the desired username.
|
||||||
|
|
||||||
// Call the GetUser function to retrieve the specified user.
|
// Call the GetUser function to retrieve the specified user.
|
||||||
user, err := endpoints.GetUser(requestContext, username)
|
user, err := endpoints.GetUser(requestContext, username)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the ID of the retrieved user.
|
// Log the ID of the retrieved user.
|
||||||
log.Println(user.ID)
|
log.Println(user.ID)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of users.
|
// Log: Getting a list of users.
|
||||||
log.Println("Getting a list of users: ")
|
log.Println("Getting a list of users: ")
|
||||||
|
|
||||||
// Define query parameters for retrieving a list of users.
|
// Define query parameters for retrieving a list of users.
|
||||||
query := map[string]string{
|
query := map[string]string{
|
||||||
"limit": "5",
|
"limit": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the GetUsers function to retrieve a list of users based on the query parameters.
|
// Call the GetUsers function to retrieve a list of users based on the query parameters.
|
||||||
userList, err := endpoints.GetUsers(requestContext, query)
|
userList, err := endpoints.GetUsers(requestContext, query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of users retrieved.
|
// Log the number of users retrieved.
|
||||||
log.Println(len(userList))
|
log.Println(len(userList))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
43
example/midlevel/dmail.go
Normal file
43
example/midlevel/dmail.go
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
|
_ "github.com/joho/godotenv/autoload"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
requestContext := model.RequestContext{
|
||||||
|
Client: http.Client{},
|
||||||
|
Host: "https://e621.net",
|
||||||
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
|
Username: os.Getenv("API_USER"),
|
||||||
|
APIKey: os.Getenv("API_KEY"),
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Getting DMails API user: ")
|
||||||
|
|
||||||
|
getDMails := builder.NewGetDMailsBuilder(requestContext)
|
||||||
|
dMails, err := getDMails.SetLimit(5).Execute()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
} else {
|
||||||
|
log.Println(dMails[0].Title)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
|
||||||
|
log.Println("Getting DMails for user: ")
|
||||||
|
|
||||||
|
dMails, err = getDMails.SetLimit(5).ByToName("specificUser").Execute()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
} else {
|
||||||
|
log.Println(dMails[0].Title)
|
||||||
|
}
|
||||||
|
log.Println("----------")
|
||||||
|
}
|
|
@ -1,49 +1,49 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting favorites from the API.
|
// Log: Getting favorites from the API.
|
||||||
log.Println("Getting favorites API user: ")
|
log.Println("Getting favorites API user: ")
|
||||||
|
|
||||||
// Call the GetFavorites function to retrieve favorite posts.
|
// Call the GetFavorites function to retrieve favorite posts.
|
||||||
getFavorites := builder.NewGetFavoritesBuilder(requestContext)
|
getFavorites := builder.NewGetFavoritesBuilder(requestContext)
|
||||||
posts, err := getFavorites.SetLimit(5).Execute()
|
posts, err := getFavorites.SetLimit(5).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the first favorite post.
|
// Log the URL of the first favorite post.
|
||||||
log.Println(posts[0].File.URL)
|
log.Println(posts[0].File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting favorites for a specific user.
|
// Log: Getting favorites for a specific user.
|
||||||
log.Println("Getting favorites for user: ")
|
log.Println("Getting favorites for user: ")
|
||||||
|
|
||||||
// Call the GetFavorites function to retrieve favorite posts for the specified user.
|
// Call the GetFavorites function to retrieve favorite posts for the specified user.
|
||||||
posts, err = getFavorites.SetLimit(5).SetUserID(1337).Execute()
|
posts, err = getFavorites.SetLimit(5).SetUserID(1337).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the first favorite post.
|
// Log the URL of the first favorite post.
|
||||||
log.Println(posts[0].File.URL)
|
log.Println(posts[0].File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,58 +1,58 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single note.
|
// Log: Getting a single note.
|
||||||
log.Println("Getting single note: ")
|
log.Println("Getting single note: ")
|
||||||
|
|
||||||
// Specify the note ID for retrieval.
|
// Specify the note ID for retrieval.
|
||||||
noteID := 36957 // Replace with the desired note's ID.
|
noteID := 36957 // Replace with the desired note's ID.
|
||||||
|
|
||||||
// Call the GetNote function to retrieve the specified note.
|
// Call the GetNote function to retrieve the specified note.
|
||||||
getNote := builder.NewGetNoteBuilder(requestContext)
|
getNote := builder.NewGetNoteBuilder(requestContext)
|
||||||
note, err := getNote.SetNoteID(noteID).Execute()
|
note, err := getNote.SetNoteID(noteID).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the body of the retrieved note.
|
// Log the body of the retrieved note.
|
||||||
log.Println(note.Body)
|
log.Println(note.Body)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of notes.
|
// Log: Getting a list of notes.
|
||||||
log.Println("Getting a list of notes: ")
|
log.Println("Getting a list of notes: ")
|
||||||
|
|
||||||
// Call the GetNotes function to retrieve a list of notes based on the query parameters.
|
// Call the GetNotes function to retrieve a list of notes based on the query parameters.
|
||||||
getNotes := builder.NewGetNotesBuilder(requestContext)
|
getNotes := builder.NewGetNotesBuilder(requestContext)
|
||||||
notes, err := getNotes.SetLimit(5).Active(true).SearchInBody("furry").Execute()
|
notes, err := getNotes.SetLimit(5).Active(true).SearchInBody("furry").Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of notes retrieved.
|
// Log the number of notes retrieved.
|
||||||
log.Println(len(notes))
|
log.Println(len(notes))
|
||||||
for _, note := range notes {
|
for _, note := range notes {
|
||||||
log.Printf("Note by %s - %s : %s", note.CreatorName, note.Body, strconv.FormatInt(note.ID, 10))
|
log.Printf("Note by %s - %s : %s", note.CreatorName, note.Body, strconv.FormatInt(note.ID, 10))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single pool.
|
// Log: Getting a single pool.
|
||||||
log.Println("Getting single pool: ")
|
log.Println("Getting single pool: ")
|
||||||
|
|
||||||
// Specify the pool ID for retrieval.
|
// Specify the pool ID for retrieval.
|
||||||
poolID := 36957 // Replace with the desired pool's ID.
|
poolID := 36957 // Replace with the desired pool's ID.
|
||||||
|
|
||||||
// Call the GetPool function to retrieve the specified pool.
|
// Call the GetPool function to retrieve the specified pool.
|
||||||
getPool := builder.NewGetPoolBuilder(requestContext)
|
getPool := builder.NewGetPoolBuilder(requestContext)
|
||||||
pool, err := getPool.ID(poolID).Execute()
|
pool, err := getPool.ID(poolID).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the name of the retrieved pool.
|
// Log the name of the retrieved pool.
|
||||||
log.Println(pool.Name)
|
log.Println(pool.Name)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of pools.
|
// Log: Getting a list of pools.
|
||||||
log.Println("Getting a list of pools: ")
|
log.Println("Getting a list of pools: ")
|
||||||
|
|
||||||
// Call the GetPools function to retrieve a list of pools based on the query parameters.
|
// Call the GetPools function to retrieve a list of pools based on the query parameters.
|
||||||
getPools := builder.NewGetPoolsBuilder(requestContext)
|
getPools := builder.NewGetPoolsBuilder(requestContext)
|
||||||
pools, err := getPools.SetLimit(5).Active(true).SearchDescription("mass effect").Execute()
|
pools, err := getPools.SetLimit(5).Active(true).SearchDescription("mass effect").Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of pools retrieved.
|
// Log the number of pools retrieved.
|
||||||
log.Println(len(pools))
|
log.Println(len(pools))
|
||||||
log.Println(pools[1].Name)
|
log.Println(pools[1].Name)
|
||||||
log.Println(pools[1].ID)
|
log.Println(pools[1].ID)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,68 +1,68 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single post.
|
// Log: Getting a single post.
|
||||||
log.Println("Getting single post: ")
|
log.Println("Getting single post: ")
|
||||||
|
|
||||||
// Specify the post ID for retrieval.
|
// Specify the post ID for retrieval.
|
||||||
var postID model.PostID = 4353480 // Replace with the desired post's ID.
|
var postID model.PostID = 4353480 // Replace with the desired post's ID.
|
||||||
|
|
||||||
// Call the GetPost function to retrieve the specified post.
|
// Call the GetPost function to retrieve the specified post.
|
||||||
getPost := builder.NewGetPostBuilder(requestContext)
|
getPost := builder.NewGetPostBuilder(requestContext)
|
||||||
post, err := getPost.SetPostID(postID).Execute()
|
post, err := getPost.SetPostID(postID).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the URL of the retrieved post.
|
// Log the URL of the retrieved post.
|
||||||
log.Println(post.File.URL)
|
log.Println(post.File.URL)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of posts.
|
// Log: Getting a list of posts.
|
||||||
log.Println("Getting a list of posts: ")
|
log.Println("Getting a list of posts: ")
|
||||||
|
|
||||||
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
||||||
getPosts := builder.NewGetPostsBuilder(requestContext)
|
getPosts := builder.NewGetPostsBuilder(requestContext)
|
||||||
posts, err := getPosts.SetLimit(5).Execute()
|
posts, err := getPosts.SetLimit(5).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of posts retrieved.
|
// Log the number of posts retrieved.
|
||||||
log.Println(len(posts))
|
log.Println(len(posts))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of posts with tags.
|
// Log: Getting a list of posts with tags.
|
||||||
log.Println("Getting a list of posts: ")
|
log.Println("Getting a list of posts: ")
|
||||||
|
|
||||||
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
// Call the GetPosts function to retrieve a list of posts based on the query parameters.
|
||||||
posts, err = getPosts.SetLimit(5).Tags("fennec").Execute()
|
posts, err = getPosts.SetLimit(5).Tags("fennec").Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of posts retrieved.
|
// Log the number of posts retrieved.
|
||||||
log.Println(len(posts))
|
log.Println(len(posts))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,81 +1,81 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single tag.
|
// Log: Getting a single tag.
|
||||||
log.Println("Getting a single tag: ")
|
log.Println("Getting a single tag: ")
|
||||||
|
|
||||||
// Specify the tag ID for retrieval.
|
// Specify the tag ID for retrieval.
|
||||||
tagID := 1530 // Replace with the desired tag's ID.
|
tagID := 1530 // Replace with the desired tag's ID.
|
||||||
|
|
||||||
// Call the GetTag function to retrieve the specified tag.
|
// Call the GetTag function to retrieve the specified tag.
|
||||||
getTag := builder.NewGetTagBuilder(requestContext)
|
getTag := builder.NewGetTagBuilder(requestContext)
|
||||||
tag, err := getTag.SetTagID(tagID).Execute()
|
tag, err := getTag.SetTagID(tagID).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the name of the retrieved tag.
|
// Log the name of the retrieved tag.
|
||||||
log.Println(tag.Name)
|
log.Println(tag.Name)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of tags.
|
// Log: Getting a list of tags.
|
||||||
log.Println("Getting a list of tags: ")
|
log.Println("Getting a list of tags: ")
|
||||||
|
|
||||||
// Call the GetTags function to retrieve a list of tags based on the query parameters.
|
// Call the GetTags function to retrieve a list of tags based on the query parameters.
|
||||||
getTags := builder.NewGetTagsBuilder(requestContext)
|
getTags := builder.NewGetTagsBuilder(requestContext)
|
||||||
tagList, err := getTags.SetLimit(5).Artist(false).Execute()
|
tagList, err := getTags.SetLimit(5).Artist(false).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of tags retrieved.
|
// Log the number of tags retrieved.
|
||||||
log.Println(len(tagList))
|
log.Println(len(tagList))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Searching for tags containing "cat."
|
// Log: Searching for tags containing "cat."
|
||||||
log.Println("Searching for tags containing 'cat': ")
|
log.Println("Searching for tags containing 'cat': ")
|
||||||
|
|
||||||
// Call the GetTags function with the search query to retrieve matching tags.
|
// Call the GetTags function with the search query to retrieve matching tags.
|
||||||
tagList, err = getTags.SetLimit(5).SearchName("cat*").Execute()
|
tagList, err = getTags.SetLimit(5).SearchName("cat*").Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the retrieved tags.
|
// Log the retrieved tags.
|
||||||
log.Println(tagList)
|
log.Println(tagList)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Searching for tags with the category "artist."
|
// Log: Searching for tags with the category "artist."
|
||||||
log.Println("Searching for tags with the category 'artist': ")
|
log.Println("Searching for tags with the category 'artist': ")
|
||||||
|
|
||||||
// Call the GetTags function with the category filter to retrieve artist tags.
|
// Call the GetTags function with the category filter to retrieve artist tags.
|
||||||
tagList, err = getTags.SetLimit(5).SearchCategory(model.Artist).Execute()
|
tagList, err = getTags.SetLimit(5).SearchCategory(model.Artist).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the retrieved artist tags.
|
// Log the retrieved artist tags.
|
||||||
log.Println(tagList)
|
log.Println(tagList)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,54 +1,54 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Define the request context with essential information.
|
// Define the request context with essential information.
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: os.Getenv("API_USER"), // Replace with your username
|
Username: os.Getenv("API_USER"), // Replace with your username
|
||||||
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
APIKey: os.Getenv("API_KEY"), // Replace with your API key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log: Getting a single user.
|
// Log: Getting a single user.
|
||||||
log.Println("Getting a single user: ")
|
log.Println("Getting a single user: ")
|
||||||
|
|
||||||
// Specify the username for retrieval.
|
// Specify the username for retrieval.
|
||||||
username := "selloo" // Replace with the desired username.
|
username := "selloo" // Replace with the desired username.
|
||||||
|
|
||||||
// Call the GetUser function to retrieve the specified user.
|
// Call the GetUser function to retrieve the specified user.
|
||||||
userBuilder := builder.NewGetUserBuilder(requestContext)
|
userBuilder := builder.NewGetUserBuilder(requestContext)
|
||||||
user, err := userBuilder.SetUsername(username).Execute()
|
user, err := userBuilder.SetUsername(username).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the ID of the retrieved user.
|
// Log the ID of the retrieved user.
|
||||||
log.Println(user.ID)
|
log.Println(user.ID)
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
|
|
||||||
// Log: Getting a list of users.
|
// Log: Getting a list of users.
|
||||||
log.Println("Getting a list of users: ")
|
log.Println("Getting a list of users: ")
|
||||||
|
|
||||||
// Call the GetUsers function to retrieve a list of users based on the query parameters.
|
// Call the GetUsers function to retrieve a list of users based on the query parameters.
|
||||||
usersBuilder := builder.NewGetUsersBuilder(requestContext)
|
usersBuilder := builder.NewGetUsersBuilder(requestContext)
|
||||||
userList, err := usersBuilder.SetLimit(5).Execute()
|
userList, err := usersBuilder.SetLimit(5).Execute()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
} else {
|
} else {
|
||||||
// Log the number of users retrieved.
|
// Log the number of users retrieved.
|
||||||
log.Println(len(userList))
|
log.Println(len(userList))
|
||||||
}
|
}
|
||||||
log.Println("----------")
|
log.Println("----------")
|
||||||
}
|
}
|
||||||
|
|
22
go.mod
22
go.mod
|
@ -1,11 +1,11 @@
|
||||||
module git.dragse.it/anthrove/e621-sdk-go
|
module git.dragse.it/anthrove/e621-sdk-go
|
||||||
|
|
||||||
go 1.21.3
|
go 1.21.3
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/jarcoal/httpmock v1.3.1
|
github.com/jarcoal/httpmock v1.3.1
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/joho/godotenv v1.5.1
|
||||||
golang.org/x/time v0.3.0
|
golang.org/x/time v0.3.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require golang.org/x/net v0.18.0 // indirect
|
require golang.org/x/net v0.18.0 // indirect
|
||||||
|
|
24
go.sum
24
go.sum
|
@ -1,12 +1,12 @@
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
|
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
|
||||||
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
|
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
|
||||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g=
|
github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g=
|
||||||
github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM=
|
github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM=
|
||||||
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
|
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
|
||||||
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
|
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
|
79
pkg/e621/builder/dmail.go
Normal file
79
pkg/e621/builder/dmail.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package builder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DMailsBuilder interface {
|
||||||
|
ByTitle(title string) DMailsBuilder
|
||||||
|
ByBody(body string) DMailsBuilder
|
||||||
|
ByToName(toName string) DMailsBuilder
|
||||||
|
ByFromName(fromName string) DMailsBuilder
|
||||||
|
SetLimit(limit int) DMailsBuilder
|
||||||
|
PageNumber(number int) DMailsBuilder
|
||||||
|
Execute() ([]model.DMail, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type getDMails struct {
|
||||||
|
requestContext model.RequestContext
|
||||||
|
query map[string]string
|
||||||
|
id int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetDMailsBuilder(requestContext model.RequestContext) DMailsBuilder {
|
||||||
|
dMailsBuilder := &getDMails{
|
||||||
|
requestContext: requestContext,
|
||||||
|
query: make(map[string]string),
|
||||||
|
}
|
||||||
|
|
||||||
|
return dMailsBuilder.SetLimit(utils.E621_MAX_POST_COUNT)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) ByTitle(title string) DMailsBuilder {
|
||||||
|
g.query["search[title_matches]"] = title
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) ByBody(body string) DMailsBuilder {
|
||||||
|
g.query["search[message_matches]"] = body
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) ByToName(toName string) DMailsBuilder {
|
||||||
|
g.query["search[to_name]"] = toName
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) ByFromName(fromName string) DMailsBuilder {
|
||||||
|
g.query["search[from_name]"] = fromName
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) SetLimit(limit int) DMailsBuilder {
|
||||||
|
g.query["limit"] = strconv.Itoa(limit)
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) PageNumber(number int) DMailsBuilder {
|
||||||
|
g.query["page"] = strconv.Itoa(number)
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g getDMails) Execute() ([]model.DMail, error) {
|
||||||
|
if g.requestContext.RateLimiter != nil {
|
||||||
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
favorites, err := endpoints.GetAllDmails(g.requestContext, g.query)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return favorites, nil
|
||||||
|
}
|
|
@ -1,66 +1,66 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FavoritesBuilder represents a builder for constructing queries to retrieve user's favorite posts.
|
// FavoritesBuilder represents a builder for constructing queries to retrieve user's favorite posts.
|
||||||
type FavoritesBuilder interface {
|
type FavoritesBuilder interface {
|
||||||
// SetUserID sets the user ID for the query.
|
// SetUserID sets the user ID for the query.
|
||||||
SetUserID(userID model.UserID) FavoritesBuilder
|
SetUserID(userID model.UserID) FavoritesBuilder
|
||||||
// SetLimit sets the maximum number of favorite posts to retrieve.
|
// SetLimit sets the maximum number of favorite posts to retrieve.
|
||||||
SetLimit(limitFavorites int) FavoritesBuilder
|
SetLimit(limitFavorites int) FavoritesBuilder
|
||||||
// Page sets the page number for paginated results.
|
// Page sets the page number for paginated results.
|
||||||
Page(pageNumber int) FavoritesBuilder
|
Page(pageNumber int) FavoritesBuilder
|
||||||
// Execute sends the constructed query and returns a slice of favorite posts and an error if any.
|
// Execute sends the constructed query and returns a slice of favorite posts and an error if any.
|
||||||
Execute() ([]model.Post, error)
|
Execute() ([]model.Post, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetFavoritesBuilder creates a new FavoritesBuilder with the provided RequestContext.
|
// NewGetFavoritesBuilder creates a new FavoritesBuilder with the provided RequestContext.
|
||||||
func NewGetFavoritesBuilder(requestContext model.RequestContext) FavoritesBuilder {
|
func NewGetFavoritesBuilder(requestContext model.RequestContext) FavoritesBuilder {
|
||||||
return &getFavorites{
|
return &getFavorites{
|
||||||
requestContext: requestContext,
|
requestContext: requestContext,
|
||||||
query: make(map[string]string),
|
query: make(map[string]string),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getFavorites struct {
|
type getFavorites struct {
|
||||||
query map[string]string
|
query map[string]string
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetUserID sets the user ID for the query.
|
// SetUserID sets the user ID for the query.
|
||||||
func (g *getFavorites) SetUserID(userID model.UserID) FavoritesBuilder {
|
func (g *getFavorites) SetUserID(userID model.UserID) FavoritesBuilder {
|
||||||
g.query["user_id"] = strconv.Itoa(int(userID))
|
g.query["user_id"] = strconv.Itoa(int(userID))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of favorite posts to retrieve.
|
// SetLimit sets the maximum number of favorite posts to retrieve.
|
||||||
func (g *getFavorites) SetLimit(limitFavorites int) FavoritesBuilder {
|
func (g *getFavorites) SetLimit(limitFavorites int) FavoritesBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitFavorites)
|
g.query["limit"] = strconv.Itoa(limitFavorites)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Page sets the page number for paginated results.
|
// Page sets the page number for paginated results.
|
||||||
func (g *getFavorites) Page(pageNumber int) FavoritesBuilder {
|
func (g *getFavorites) Page(pageNumber int) FavoritesBuilder {
|
||||||
g.query["page"] = strconv.Itoa(pageNumber)
|
g.query["page"] = strconv.Itoa(pageNumber)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns a slice of favorite posts and an error if any.
|
// Execute sends the constructed query and returns a slice of favorite posts and an error if any.
|
||||||
func (g *getFavorites) Execute() ([]model.Post, error) {
|
func (g *getFavorites) Execute() ([]model.Post, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
favorites, err := endpoints.GetFavorites(g.requestContext, g.query)
|
favorites, err := endpoints.GetFavorites(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return favorites, nil
|
return favorites, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetFavorites(t *testing.T) {
|
func TestGetFavorites(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonResponser, err := httpmock.NewJsonResponder(200, response)
|
jsonResponser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/favorites.json", jsonResponser)
|
httpmock.RegisterResponder("GET", "https://e621.net/favorites.json", jsonResponser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
getFavorites := NewGetFavoritesBuilder(requestContext)
|
getFavorites := NewGetFavoritesBuilder(requestContext)
|
||||||
posts, err := getFavorites.SetLimit(3).Execute()
|
posts, err := getFavorites.SetLimit(3).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NoteBuilder represents a builder for constructing queries to retrieve a specific note.
|
// NoteBuilder represents a builder for constructing queries to retrieve a specific note.
|
||||||
type NoteBuilder interface {
|
type NoteBuilder interface {
|
||||||
// SetNoteID sets the note ID for the query.
|
// SetNoteID sets the note ID for the query.
|
||||||
SetNoteID(noteID int) NoteBuilder
|
SetNoteID(noteID int) NoteBuilder
|
||||||
// Execute sends the constructed query and returns the requested note and an error, if any.
|
// Execute sends the constructed query and returns the requested note and an error, if any.
|
||||||
Execute() (*model.Note, error)
|
Execute() (*model.Note, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetNoteBuilder creates a new NoteBuilder with the provided RequestContext.
|
// NewGetNoteBuilder creates a new NoteBuilder with the provided RequestContext.
|
||||||
func NewGetNoteBuilder(requestContext model.RequestContext) NoteBuilder {
|
func NewGetNoteBuilder(requestContext model.RequestContext) NoteBuilder {
|
||||||
return &getNote{requestContext: requestContext}
|
return &getNote{requestContext: requestContext}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getNote struct {
|
type getNote struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
noteID int
|
noteID int
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNoteID sets the note ID for the query.
|
// SetNoteID sets the note ID for the query.
|
||||||
func (g *getNote) SetNoteID(noteID int) NoteBuilder {
|
func (g *getNote) SetNoteID(noteID int) NoteBuilder {
|
||||||
g.noteID = noteID
|
g.noteID = noteID
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested note and an error, if any.
|
// Execute sends the constructed query and returns the requested note and an error, if any.
|
||||||
func (g *getNote) Execute() (*model.Note, error) {
|
func (g *getNote) Execute() (*model.Note, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
note, err := endpoints.GetNote(g.requestContext, strconv.Itoa(g.noteID))
|
note, err := endpoints.GetNote(g.requestContext, strconv.Itoa(g.noteID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return ¬e, nil
|
return ¬e, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetNote(t *testing.T) {
|
func TestGetNote(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Note]("../../../tests/note.json")
|
response, err := utils.LoadJsonTestData[model.Note]("../../../tests/note.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/notes/36957.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/notes/36957.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getNote := NewGetNoteBuilder(requestContext)
|
getNote := NewGetNoteBuilder(requestContext)
|
||||||
pool, err := getNote.SetNoteID(36957).Execute()
|
pool, err := getNote.SetNoteID(36957).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pool.ID == response.ID && pool.Body == response.Body {
|
if pool.ID == response.ID && pool.Body == response.Body {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,98 +1,98 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NotesBuilder represents a builder for constructing queries to retrieve notes.
|
// NotesBuilder represents a builder for constructing queries to retrieve notes.
|
||||||
type NotesBuilder interface {
|
type NotesBuilder interface {
|
||||||
// SearchInBody sets the query to search for notes containing a specific text in their body.
|
// SearchInBody sets the query to search for notes containing a specific text in their body.
|
||||||
SearchInBody(body string) NotesBuilder
|
SearchInBody(body string) NotesBuilder
|
||||||
// NoteID sets the query to search for a note with a specific note ID.
|
// NoteID sets the query to search for a note with a specific note ID.
|
||||||
NoteID(noteID int) NotesBuilder
|
NoteID(noteID int) NotesBuilder
|
||||||
// SearchTags sets the query to search for notes containing specific tags.
|
// SearchTags sets the query to search for notes containing specific tags.
|
||||||
SearchTags(tags string) NotesBuilder
|
SearchTags(tags string) NotesBuilder
|
||||||
// SearchCreatorID sets the query to search for notes created by a specific user (by their user ID).
|
// SearchCreatorID sets the query to search for notes created by a specific user (by their user ID).
|
||||||
SearchCreatorID(creatorID int) NotesBuilder
|
SearchCreatorID(creatorID int) NotesBuilder
|
||||||
// SearchCreatorName sets the query to search for notes created by a specific user (by their username).
|
// SearchCreatorName sets the query to search for notes created by a specific user (by their username).
|
||||||
SearchCreatorName(creatorName string) NotesBuilder
|
SearchCreatorName(creatorName string) NotesBuilder
|
||||||
// Active sets whether to search for active or inactive notes.
|
// Active sets whether to search for active or inactive notes.
|
||||||
Active(isActive bool) NotesBuilder
|
Active(isActive bool) NotesBuilder
|
||||||
// SetLimit sets the maximum number of notes to retrieve.
|
// SetLimit sets the maximum number of notes to retrieve.
|
||||||
SetLimit(limitNotes int) NotesBuilder
|
SetLimit(limitNotes int) NotesBuilder
|
||||||
// Execute sends the constructed query and returns a slice of notes and an error, if any.
|
// Execute sends the constructed query and returns a slice of notes and an error, if any.
|
||||||
Execute() ([]model.Note, error)
|
Execute() ([]model.Note, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetNotesBuilder creates a new NotesBuilder with the provided RequestContext.
|
// NewGetNotesBuilder creates a new NotesBuilder with the provided RequestContext.
|
||||||
func NewGetNotesBuilder(requestContext model.RequestContext) NotesBuilder {
|
func NewGetNotesBuilder(requestContext model.RequestContext) NotesBuilder {
|
||||||
return &getNotes{
|
return &getNotes{
|
||||||
requestContext: requestContext,
|
requestContext: requestContext,
|
||||||
query: make(map[string]string),
|
query: make(map[string]string),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getNotes struct {
|
type getNotes struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
query map[string]string
|
query map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchInBody sets the query to search for notes containing a specific text in their body.
|
// SearchInBody sets the query to search for notes containing a specific text in their body.
|
||||||
func (g *getNotes) SearchInBody(body string) NotesBuilder {
|
func (g *getNotes) SearchInBody(body string) NotesBuilder {
|
||||||
g.query["search[body_matches]"] = body
|
g.query["search[body_matches]"] = body
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// NoteID sets the query to search for a note with a specific note ID.
|
// NoteID sets the query to search for a note with a specific note ID.
|
||||||
func (g *getNotes) NoteID(noteID int) NotesBuilder {
|
func (g *getNotes) NoteID(noteID int) NotesBuilder {
|
||||||
g.query["search[post_id]"] = strconv.Itoa(noteID)
|
g.query["search[post_id]"] = strconv.Itoa(noteID)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchTags sets the query to search for notes containing specific tags.
|
// SearchTags sets the query to search for notes containing specific tags.
|
||||||
func (g *getNotes) SearchTags(tags string) NotesBuilder {
|
func (g *getNotes) SearchTags(tags string) NotesBuilder {
|
||||||
g.query["search[post_tags_match]"] = tags
|
g.query["search[post_tags_match]"] = tags
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCreatorID sets the query to search for notes created by a specific user (by their user ID).
|
// SearchCreatorID sets the query to search for notes created by a specific user (by their user ID).
|
||||||
func (g *getNotes) SearchCreatorID(creatorID int) NotesBuilder {
|
func (g *getNotes) SearchCreatorID(creatorID int) NotesBuilder {
|
||||||
g.query["search[creator_id]"] = strconv.Itoa(creatorID)
|
g.query["search[creator_id]"] = strconv.Itoa(creatorID)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCreatorName sets the query to search for notes created by a specific user (by their username).
|
// SearchCreatorName sets the query to search for notes created by a specific user (by their username).
|
||||||
func (g *getNotes) SearchCreatorName(creatorName string) NotesBuilder {
|
func (g *getNotes) SearchCreatorName(creatorName string) NotesBuilder {
|
||||||
g.query["search[creator_name]"] = creatorName
|
g.query["search[creator_name]"] = creatorName
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Active sets whether to search for active or inactive notes.
|
// Active sets whether to search for active or inactive notes.
|
||||||
func (g *getNotes) Active(isActive bool) NotesBuilder {
|
func (g *getNotes) Active(isActive bool) NotesBuilder {
|
||||||
g.query["search[is_active]"] = strconv.FormatBool(isActive)
|
g.query["search[is_active]"] = strconv.FormatBool(isActive)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of notes to retrieve.
|
// SetLimit sets the maximum number of notes to retrieve.
|
||||||
func (g *getNotes) SetLimit(limitNotes int) NotesBuilder {
|
func (g *getNotes) SetLimit(limitNotes int) NotesBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitNotes)
|
g.query["limit"] = strconv.Itoa(limitNotes)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns a slice of notes and an error, if any.
|
// Execute sends the constructed query and returns a slice of notes and an error, if any.
|
||||||
func (g *getNotes) Execute() ([]model.Note, error) {
|
func (g *getNotes) Execute() ([]model.Note, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
notes, err := endpoints.GetNotes(g.requestContext, g.query)
|
notes, err := endpoints.GetNotes(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return notes, nil
|
return notes, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetNotes(t *testing.T) {
|
func TestGetNotes(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.Note]("../../../tests/notes.json")
|
response, err := utils.LoadJsonTestData[[]model.Note]("../../../tests/notes.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/notes.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/notes.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getNotes := NewGetNotesBuilder(requestContext)
|
getNotes := NewGetNotesBuilder(requestContext)
|
||||||
pools, err := getNotes.SetLimit(3).Execute()
|
pools, err := getNotes.SetLimit(3).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pools[0].ID == response[0].ID && pools[1].Body == response[1].Body && pools[2].UpdatedAt == response[2].UpdatedAt {
|
if pools[0].ID == response[0].ID && pools[1].Body == response[1].Body && pools[2].UpdatedAt == response[2].UpdatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PoolBuilder represents a builder for constructing queries to retrieve a specific pool.
|
// PoolBuilder represents a builder for constructing queries to retrieve a specific pool.
|
||||||
type PoolBuilder interface {
|
type PoolBuilder interface {
|
||||||
// ID sets the pool ID for the query.
|
// ID sets the pool ID for the query.
|
||||||
ID(poolID int) PoolBuilder
|
ID(poolID int) PoolBuilder
|
||||||
// Execute sends the constructed query and returns the requested pool and an error, if any.
|
// Execute sends the constructed query and returns the requested pool and an error, if any.
|
||||||
Execute() (model.Pool, error)
|
Execute() (model.Pool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetPoolBuilder creates a new PoolBuilder with the provided RequestContext.
|
// NewGetPoolBuilder creates a new PoolBuilder with the provided RequestContext.
|
||||||
func NewGetPoolBuilder(requestContext model.RequestContext) PoolBuilder {
|
func NewGetPoolBuilder(requestContext model.RequestContext) PoolBuilder {
|
||||||
return &getPool{requestContext: requestContext}
|
return &getPool{requestContext: requestContext}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getPool struct {
|
type getPool struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
id int
|
id int
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID sets the pool ID for the query.
|
// ID sets the pool ID for the query.
|
||||||
func (g *getPool) ID(poolID int) PoolBuilder {
|
func (g *getPool) ID(poolID int) PoolBuilder {
|
||||||
g.id = poolID
|
g.id = poolID
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested pool and an error, if any.
|
// Execute sends the constructed query and returns the requested pool and an error, if any.
|
||||||
func (g *getPool) Execute() (model.Pool, error) {
|
func (g *getPool) Execute() (model.Pool, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.Pool{}, err
|
return model.Pool{}, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pool, err := endpoints.GetPool(g.requestContext, strconv.Itoa(g.id))
|
pool, err := endpoints.GetPool(g.requestContext, strconv.Itoa(g.id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.Pool{}, err
|
return model.Pool{}, err
|
||||||
}
|
}
|
||||||
return pool, nil
|
return pool, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPool(t *testing.T) {
|
func TestGetPool(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Pool]("../../../tests/pool.json")
|
response, err := utils.LoadJsonTestData[model.Pool]("../../../tests/pool.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/pools/36957.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/pools/36957.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getPool := NewGetPoolBuilder(requestContext)
|
getPool := NewGetPoolBuilder(requestContext)
|
||||||
pool, err := getPool.ID(36957).Execute()
|
pool, err := getPool.ID(36957).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pool.ID == response.ID && pool.Name == response.Name {
|
if pool.ID == response.ID && pool.Name == response.Name {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,114 +1,114 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PoolsBuilder represents a builder for constructing queries to retrieve pools.
|
// PoolsBuilder represents a builder for constructing queries to retrieve pools.
|
||||||
type PoolsBuilder interface {
|
type PoolsBuilder interface {
|
||||||
// SearchName sets the query to search for pools with a specific name.
|
// SearchName sets the query to search for pools with a specific name.
|
||||||
SearchName(name string) PoolsBuilder
|
SearchName(name string) PoolsBuilder
|
||||||
// SearchID sets the query to search for pools with specific pool IDs.
|
// SearchID sets the query to search for pools with specific pool IDs.
|
||||||
SearchID(poolIDs string) PoolsBuilder
|
SearchID(poolIDs string) PoolsBuilder
|
||||||
// SearchDescription sets the query to search for pools with specific descriptions.
|
// SearchDescription sets the query to search for pools with specific descriptions.
|
||||||
SearchDescription(description string) PoolsBuilder
|
SearchDescription(description string) PoolsBuilder
|
||||||
// SearchCreatorID sets the query to search for pools created by a specific user (by their user ID).
|
// SearchCreatorID sets the query to search for pools created by a specific user (by their user ID).
|
||||||
SearchCreatorID(creatorID int) PoolsBuilder
|
SearchCreatorID(creatorID int) PoolsBuilder
|
||||||
// SearchCreatorName sets the query to search for pools created by a specific user (by their username).
|
// SearchCreatorName sets the query to search for pools created by a specific user (by their username).
|
||||||
SearchCreatorName(creatorName string) PoolsBuilder
|
SearchCreatorName(creatorName string) PoolsBuilder
|
||||||
// Active sets whether to search for active or inactive pools.
|
// Active sets whether to search for active or inactive pools.
|
||||||
Active(isActive bool) PoolsBuilder
|
Active(isActive bool) PoolsBuilder
|
||||||
// SearchCategory sets the query to search for pools in a specific category.
|
// SearchCategory sets the query to search for pools in a specific category.
|
||||||
SearchCategory(category model.PoolCategory) PoolsBuilder
|
SearchCategory(category model.PoolCategory) PoolsBuilder
|
||||||
// Order sets the ordering of the retrieved pools.
|
// Order sets the ordering of the retrieved pools.
|
||||||
Order(order model.PoolOrder) PoolsBuilder
|
Order(order model.PoolOrder) PoolsBuilder
|
||||||
// SetLimit sets the maximum number of pools to retrieve.
|
// SetLimit sets the maximum number of pools to retrieve.
|
||||||
SetLimit(limitPools int) PoolsBuilder
|
SetLimit(limitPools int) PoolsBuilder
|
||||||
// Execute sends the constructed query and returns a slice of pools and an error, if any.
|
// Execute sends the constructed query and returns a slice of pools and an error, if any.
|
||||||
Execute() ([]model.Pool, error)
|
Execute() ([]model.Pool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetPoolsBuilder creates a new PoolsBuilder with the provided RequestContext.
|
// NewGetPoolsBuilder creates a new PoolsBuilder with the provided RequestContext.
|
||||||
func NewGetPoolsBuilder(requestContext model.RequestContext) PoolsBuilder {
|
func NewGetPoolsBuilder(requestContext model.RequestContext) PoolsBuilder {
|
||||||
return &getPools{
|
return &getPools{
|
||||||
requestContext: requestContext,
|
requestContext: requestContext,
|
||||||
query: make(map[string]string),
|
query: make(map[string]string),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getPools struct {
|
type getPools struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
query map[string]string
|
query map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchName sets the query to search for pools with a specific name.
|
// SearchName sets the query to search for pools with a specific name.
|
||||||
func (g *getPools) SearchName(name string) PoolsBuilder {
|
func (g *getPools) SearchName(name string) PoolsBuilder {
|
||||||
g.query["search[name_matches]"] = name
|
g.query["search[name_matches]"] = name
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchID sets the query to search for pools with specific pool IDs.
|
// SearchID sets the query to search for pools with specific pool IDs.
|
||||||
func (g *getPools) SearchID(poolIDs string) PoolsBuilder {
|
func (g *getPools) SearchID(poolIDs string) PoolsBuilder {
|
||||||
g.query["search[id]"] = poolIDs
|
g.query["search[id]"] = poolIDs
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchDescription sets the query to search for pools with specific descriptions.
|
// SearchDescription sets the query to search for pools with specific descriptions.
|
||||||
func (g *getPools) SearchDescription(description string) PoolsBuilder {
|
func (g *getPools) SearchDescription(description string) PoolsBuilder {
|
||||||
g.query["search[description_matches]"] = description
|
g.query["search[description_matches]"] = description
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCreatorID sets the query to search for pools created by a specific user (by their user ID).
|
// SearchCreatorID sets the query to search for pools created by a specific user (by their user ID).
|
||||||
func (g *getPools) SearchCreatorID(creatorID int) PoolsBuilder {
|
func (g *getPools) SearchCreatorID(creatorID int) PoolsBuilder {
|
||||||
g.query["search[creator_id]"] = strconv.Itoa(creatorID)
|
g.query["search[creator_id]"] = strconv.Itoa(creatorID)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCreatorName sets the query to search for pools created by a specific user (by their username).
|
// SearchCreatorName sets the query to search for pools created by a specific user (by their username).
|
||||||
func (g *getPools) SearchCreatorName(creatorName string) PoolsBuilder {
|
func (g *getPools) SearchCreatorName(creatorName string) PoolsBuilder {
|
||||||
g.query["search[creator_name]"] = creatorName
|
g.query["search[creator_name]"] = creatorName
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Active sets whether to search for active or inactive pools.
|
// Active sets whether to search for active or inactive pools.
|
||||||
func (g *getPools) Active(isActive bool) PoolsBuilder {
|
func (g *getPools) Active(isActive bool) PoolsBuilder {
|
||||||
g.query["search[is_active]"] = strconv.FormatBool(isActive)
|
g.query["search[is_active]"] = strconv.FormatBool(isActive)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCategory sets the query to search for pools in a specific category.
|
// SearchCategory sets the query to search for pools in a specific category.
|
||||||
func (g *getPools) SearchCategory(category model.PoolCategory) PoolsBuilder {
|
func (g *getPools) SearchCategory(category model.PoolCategory) PoolsBuilder {
|
||||||
g.query["search[category]"] = string(category)
|
g.query["search[category]"] = string(category)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Order sets the ordering of the retrieved pools.
|
// Order sets the ordering of the retrieved pools.
|
||||||
func (g *getPools) Order(order model.PoolOrder) PoolsBuilder {
|
func (g *getPools) Order(order model.PoolOrder) PoolsBuilder {
|
||||||
g.query["search[order]"] = string(order)
|
g.query["search[order]"] = string(order)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of pools to retrieve.
|
// SetLimit sets the maximum number of pools to retrieve.
|
||||||
func (g *getPools) SetLimit(limitPools int) PoolsBuilder {
|
func (g *getPools) SetLimit(limitPools int) PoolsBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitPools)
|
g.query["limit"] = strconv.Itoa(limitPools)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns a slice of pools and an error, if any.
|
// Execute sends the constructed query and returns a slice of pools and an error, if any.
|
||||||
func (g *getPools) Execute() ([]model.Pool, error) {
|
func (g *getPools) Execute() ([]model.Pool, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pools, err := endpoints.GetPools(g.requestContext, g.query)
|
pools, err := endpoints.GetPools(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return pools, nil
|
return pools, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPools(t *testing.T) {
|
func TestGetPools(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.Pool]("../../../tests/pools.json")
|
response, err := utils.LoadJsonTestData[[]model.Pool]("../../../tests/pools.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/pools.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/pools.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getPools := NewGetPoolsBuilder(requestContext)
|
getPools := NewGetPoolsBuilder(requestContext)
|
||||||
pools, err := getPools.SetLimit(4).Execute()
|
pools, err := getPools.SetLimit(4).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pools[0].ID == response[0].ID && pools[1].Name == response[1].Name && pools[2].UpdatedAt == response[2].UpdatedAt {
|
if pools[0].ID == response[0].ID && pools[1].Name == response[1].Name && pools[2].UpdatedAt == response[2].UpdatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PostBuilder represents a builder for constructing queries to retrieve a specific post.
|
// PostBuilder represents a builder for constructing queries to retrieve a specific post.
|
||||||
type PostBuilder interface {
|
type PostBuilder interface {
|
||||||
// SetPostID sets the post ID for the query.
|
// SetPostID sets the post ID for the query.
|
||||||
SetPostID(postID model.PostID) PostBuilder
|
SetPostID(postID model.PostID) PostBuilder
|
||||||
// Execute sends the constructed query and returns the requested post and an error, if any.
|
// Execute sends the constructed query and returns the requested post and an error, if any.
|
||||||
Execute() (*model.Post, error)
|
Execute() (*model.Post, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetPostBuilder creates a new PostBuilder with the provided RequestContext.
|
// NewGetPostBuilder creates a new PostBuilder with the provided RequestContext.
|
||||||
func NewGetPostBuilder(requestContext model.RequestContext) PostBuilder {
|
func NewGetPostBuilder(requestContext model.RequestContext) PostBuilder {
|
||||||
return &getPost{requestContext: requestContext}
|
return &getPost{requestContext: requestContext}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getPost struct {
|
type getPost struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
postID model.PostID
|
postID model.PostID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPostID sets the post ID for the query.
|
// SetPostID sets the post ID for the query.
|
||||||
func (g *getPost) SetPostID(postID model.PostID) PostBuilder {
|
func (g *getPost) SetPostID(postID model.PostID) PostBuilder {
|
||||||
g.postID = postID
|
g.postID = postID
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested post and an error, if any.
|
// Execute sends the constructed query and returns the requested post and an error, if any.
|
||||||
func (g *getPost) Execute() (*model.Post, error) {
|
func (g *getPost) Execute() (*model.Post, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post, err := endpoints.GetPost(g.requestContext, strconv.Itoa(int(g.postID)))
|
post, err := endpoints.GetPost(g.requestContext, strconv.Itoa(int(g.postID)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &post, nil
|
return &post, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,54 +1,54 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPost(t *testing.T) {
|
func TestGetPost(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
data, err := utils.LoadJsonTestData[model.Post]("../../../tests/post.json")
|
data, err := utils.LoadJsonTestData[model.Post]("../../../tests/post.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
response := model.PostResponse{
|
response := model.PostResponse{
|
||||||
Post: data,
|
Post: data,
|
||||||
Posts: nil,
|
Posts: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/posts/658415636580.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/posts/658415636580.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getPost := NewGetPostBuilder(requestContext)
|
getPost := NewGetPostBuilder(requestContext)
|
||||||
post, err := getPost.SetPostID(658415636580).Execute()
|
post, err := getPost.SetPostID(658415636580).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if post.ID == response.Post.ID && post.File.URL == response.Post.File.URL {
|
if post.ID == response.Post.ID && post.File.URL == response.Post.File.URL {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", post, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", post, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,85 +1,85 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PostsBuilder represents a builder for constructing queries to retrieve posts.
|
// PostsBuilder represents a builder for constructing queries to retrieve posts.
|
||||||
type PostsBuilder interface {
|
type PostsBuilder interface {
|
||||||
// Tags sets the query to search for posts with specific tags.
|
// Tags sets the query to search for posts with specific tags.
|
||||||
Tags(tags string) PostsBuilder
|
Tags(tags string) PostsBuilder
|
||||||
// PageAfter sets the query to retrieve posts after a specific post ID.
|
// PageAfter sets the query to retrieve posts after a specific post ID.
|
||||||
PageAfter(postID model.PostID) PostsBuilder
|
PageAfter(postID model.PostID) PostsBuilder
|
||||||
// PageBefore sets the query to retrieve posts before a specific post ID.
|
// PageBefore sets the query to retrieve posts before a specific post ID.
|
||||||
PageBefore(postID model.PostID) PostsBuilder
|
PageBefore(postID model.PostID) PostsBuilder
|
||||||
// PageNumber sets the query to retrieve posts on a specific page number.
|
// PageNumber sets the query to retrieve posts on a specific page number.
|
||||||
PageNumber(number int) PostsBuilder
|
PageNumber(number int) PostsBuilder
|
||||||
// SetLimit sets the maximum number of posts to retrieve.
|
// SetLimit sets the maximum number of posts to retrieve.
|
||||||
SetLimit(limitUser int) PostsBuilder
|
SetLimit(limitUser int) PostsBuilder
|
||||||
// Execute sends the constructed query and returns a slice of posts and an error, if any.
|
// Execute sends the constructed query and returns a slice of posts and an error, if any.
|
||||||
Execute() ([]model.Post, error)
|
Execute() ([]model.Post, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetPostsBuilder creates a new PostsBuilder with the provided RequestContext.
|
// NewGetPostsBuilder creates a new PostsBuilder with the provided RequestContext.
|
||||||
func NewGetPostsBuilder(requestContext model.RequestContext) PostsBuilder {
|
func NewGetPostsBuilder(requestContext model.RequestContext) PostsBuilder {
|
||||||
postBuilder := &getPosts{
|
postBuilder := &getPosts{
|
||||||
requestContext: requestContext,
|
requestContext: requestContext,
|
||||||
query: make(map[string]string),
|
query: make(map[string]string),
|
||||||
}
|
}
|
||||||
|
|
||||||
return postBuilder.SetLimit(utils.E621_MAX_POST_COUNT)
|
return postBuilder.SetLimit(utils.E621_MAX_POST_COUNT)
|
||||||
}
|
}
|
||||||
|
|
||||||
type getPosts struct {
|
type getPosts struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
query map[string]string
|
query map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tags sets the query to search for posts with specific tags.
|
// Tags sets the query to search for posts with specific tags.
|
||||||
func (g *getPosts) Tags(tags string) PostsBuilder {
|
func (g *getPosts) Tags(tags string) PostsBuilder {
|
||||||
g.query["tags"] = tags
|
g.query["tags"] = tags
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageAfter sets the query to retrieve posts after a specific post ID.
|
// PageAfter sets the query to retrieve posts after a specific post ID.
|
||||||
func (g *getPosts) PageAfter(postID model.PostID) PostsBuilder {
|
func (g *getPosts) PageAfter(postID model.PostID) PostsBuilder {
|
||||||
g.query["page"] = "a" + strconv.Itoa(int(postID))
|
g.query["page"] = "a" + strconv.Itoa(int(postID))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageBefore sets the query to retrieve posts before a specific post ID.
|
// PageBefore sets the query to retrieve posts before a specific post ID.
|
||||||
func (g *getPosts) PageBefore(postID model.PostID) PostsBuilder {
|
func (g *getPosts) PageBefore(postID model.PostID) PostsBuilder {
|
||||||
g.query["page"] = "b" + strconv.Itoa(int(postID))
|
g.query["page"] = "b" + strconv.Itoa(int(postID))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageNumber sets the query to retrieve posts on a specific page number.
|
// PageNumber sets the query to retrieve posts on a specific page number.
|
||||||
func (g *getPosts) PageNumber(number int) PostsBuilder {
|
func (g *getPosts) PageNumber(number int) PostsBuilder {
|
||||||
g.query["page"] = strconv.Itoa(number)
|
g.query["page"] = strconv.Itoa(number)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of posts to retrieve.
|
// SetLimit sets the maximum number of posts to retrieve.
|
||||||
func (g *getPosts) SetLimit(limitUser int) PostsBuilder {
|
func (g *getPosts) SetLimit(limitUser int) PostsBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitUser)
|
g.query["limit"] = strconv.Itoa(limitUser)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns a slice of posts and an error, if any.
|
// Execute sends the constructed query and returns a slice of posts and an error, if any.
|
||||||
func (g *getPosts) Execute() ([]model.Post, error) {
|
func (g *getPosts) Execute() ([]model.Post, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
posts, err := endpoints.GetPosts(g.requestContext, g.query)
|
posts, err := endpoints.GetPosts(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return posts, err
|
return posts, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPosts(t *testing.T) {
|
func TestGetPosts(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/posts.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/posts.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getPosts := NewGetPostsBuilder(requestContext)
|
getPosts := NewGetPostsBuilder(requestContext)
|
||||||
posts, err := getPosts.SetLimit(3).Execute()
|
posts, err := getPosts.SetLimit(3).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TagBuilder represents a builder for constructing queries to retrieve a specific tag.
|
// TagBuilder represents a builder for constructing queries to retrieve a specific tag.
|
||||||
type TagBuilder interface {
|
type TagBuilder interface {
|
||||||
// SetTagID sets the tag ID for the query.
|
// SetTagID sets the tag ID for the query.
|
||||||
SetTagID(tagID int) TagBuilder
|
SetTagID(tagID int) TagBuilder
|
||||||
// Execute sends the constructed query and returns the requested tag and an error, if any.
|
// Execute sends the constructed query and returns the requested tag and an error, if any.
|
||||||
Execute() (model.Tag, error)
|
Execute() (model.Tag, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetTagBuilder creates a new TagBuilder with the provided RequestContext.
|
// NewGetTagBuilder creates a new TagBuilder with the provided RequestContext.
|
||||||
func NewGetTagBuilder(requestContext model.RequestContext) TagBuilder {
|
func NewGetTagBuilder(requestContext model.RequestContext) TagBuilder {
|
||||||
return &getTag{requestContext: requestContext}
|
return &getTag{requestContext: requestContext}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getTag struct {
|
type getTag struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
tagID int
|
tagID int
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTagID sets the tag ID for the query.
|
// SetTagID sets the tag ID for the query.
|
||||||
func (g *getTag) SetTagID(tagID int) TagBuilder {
|
func (g *getTag) SetTagID(tagID int) TagBuilder {
|
||||||
g.tagID = tagID
|
g.tagID = tagID
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested tag and an error, if any.
|
// Execute sends the constructed query and returns the requested tag and an error, if any.
|
||||||
func (g *getTag) Execute() (model.Tag, error) {
|
func (g *getTag) Execute() (model.Tag, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.Tag{}, err
|
return model.Tag{}, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tag, err := endpoints.GetTag(g.requestContext, strconv.Itoa(g.tagID))
|
tag, err := endpoints.GetTag(g.requestContext, strconv.Itoa(g.tagID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.Tag{}, err
|
return model.Tag{}, err
|
||||||
}
|
}
|
||||||
return tag, nil
|
return tag, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetTag(t *testing.T) {
|
func TestGetTag(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Tag]("../../../tests/tag.json")
|
response, err := utils.LoadJsonTestData[model.Tag]("../../../tests/tag.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/tags/165165.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/tags/165165.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getTag := NewGetTagBuilder(requestContext)
|
getTag := NewGetTagBuilder(requestContext)
|
||||||
tag, err := getTag.SetTagID(165165).Execute()
|
tag, err := getTag.SetTagID(165165).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if tag.ID == response.ID && tag.Name == response.Name && tag.CreatedAt == response.CreatedAt {
|
if tag.ID == response.ID && tag.Name == response.Name && tag.CreatedAt == response.CreatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", tag, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", tag, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,103 +1,103 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TagsBuilder represents a builder for constructing queries to retrieve tags.
|
// TagsBuilder represents a builder for constructing queries to retrieve tags.
|
||||||
type TagsBuilder interface {
|
type TagsBuilder interface {
|
||||||
// SearchName sets the query to search for tags with specific names.
|
// SearchName sets the query to search for tags with specific names.
|
||||||
SearchName(name string) TagsBuilder
|
SearchName(name string) TagsBuilder
|
||||||
// SearchCategory sets the query to search for tags in a specific category.
|
// SearchCategory sets the query to search for tags in a specific category.
|
||||||
SearchCategory(category model.TagCategory) TagsBuilder
|
SearchCategory(category model.TagCategory) TagsBuilder
|
||||||
// Order sets the query to order tags by a specific criterion.
|
// Order sets the query to order tags by a specific criterion.
|
||||||
Order(order string) TagsBuilder
|
Order(order string) TagsBuilder
|
||||||
// HideEmpty sets the query to filter out tags that are empty.
|
// HideEmpty sets the query to filter out tags that are empty.
|
||||||
HideEmpty(hideEmpty bool) TagsBuilder
|
HideEmpty(hideEmpty bool) TagsBuilder
|
||||||
// Wiki sets the query to filter tags that have a wiki.
|
// Wiki sets the query to filter tags that have a wiki.
|
||||||
Wiki(hasWiki bool) TagsBuilder
|
Wiki(hasWiki bool) TagsBuilder
|
||||||
// Artist sets the query to filter tags that have an artist page.
|
// Artist sets the query to filter tags that have an artist page.
|
||||||
Artist(hasArtistPage bool) TagsBuilder
|
Artist(hasArtistPage bool) TagsBuilder
|
||||||
// SetPage sets the query to retrieve tags from a specific page number.
|
// SetPage sets the query to retrieve tags from a specific page number.
|
||||||
SetPage(pageNumber int) TagsBuilder
|
SetPage(pageNumber int) TagsBuilder
|
||||||
// SetLimit sets the maximum number of tags to retrieve.
|
// SetLimit sets the maximum number of tags to retrieve.
|
||||||
SetLimit(limitUser int) TagsBuilder
|
SetLimit(limitUser int) TagsBuilder
|
||||||
// Execute sends the constructed query and returns a slice of tags and an error, if any.
|
// Execute sends the constructed query and returns a slice of tags and an error, if any.
|
||||||
Execute() ([]model.Tag, error)
|
Execute() ([]model.Tag, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetTagsBuilder creates a new TagsBuilder with the provided RequestContext.
|
// NewGetTagsBuilder creates a new TagsBuilder with the provided RequestContext.
|
||||||
func NewGetTagsBuilder(requestContext model.RequestContext) TagsBuilder {
|
func NewGetTagsBuilder(requestContext model.RequestContext) TagsBuilder {
|
||||||
return &getTags{requestContext: requestContext, query: make(map[string]string)}
|
return &getTags{requestContext: requestContext, query: make(map[string]string)}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getTags struct {
|
type getTags struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
query map[string]string
|
query map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchName sets the query to search for tags with specific names.
|
// SearchName sets the query to search for tags with specific names.
|
||||||
func (g *getTags) SearchName(name string) TagsBuilder {
|
func (g *getTags) SearchName(name string) TagsBuilder {
|
||||||
g.query["search[name_matches]"] = name
|
g.query["search[name_matches]"] = name
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchCategory sets the query to search for tags in a specific category.
|
// SearchCategory sets the query to search for tags in a specific category.
|
||||||
func (g *getTags) SearchCategory(category model.TagCategory) TagsBuilder {
|
func (g *getTags) SearchCategory(category model.TagCategory) TagsBuilder {
|
||||||
g.query["search[category]"] = strconv.Itoa(int(category))
|
g.query["search[category]"] = strconv.Itoa(int(category))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Order sets the query to order tags by a specific criterion.
|
// Order sets the query to order tags by a specific criterion.
|
||||||
func (g *getTags) Order(order string) TagsBuilder {
|
func (g *getTags) Order(order string) TagsBuilder {
|
||||||
g.query["search[order]"] = order
|
g.query["search[order]"] = order
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// HideEmpty sets the query to filter out tags that are empty.
|
// HideEmpty sets the query to filter out tags that are empty.
|
||||||
func (g *getTags) HideEmpty(hideEmpty bool) TagsBuilder {
|
func (g *getTags) HideEmpty(hideEmpty bool) TagsBuilder {
|
||||||
g.query["search[hide_empty]"] = strconv.FormatBool(hideEmpty)
|
g.query["search[hide_empty]"] = strconv.FormatBool(hideEmpty)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wiki sets the query to filter tags that have a wiki.
|
// Wiki sets the query to filter tags that have a wiki.
|
||||||
func (g *getTags) Wiki(hasWiki bool) TagsBuilder {
|
func (g *getTags) Wiki(hasWiki bool) TagsBuilder {
|
||||||
g.query["search[has_wiki]"] = strconv.FormatBool(hasWiki)
|
g.query["search[has_wiki]"] = strconv.FormatBool(hasWiki)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Artist sets the query to filter tags that have an artist page.
|
// Artist sets the query to filter tags that have an artist page.
|
||||||
func (g *getTags) Artist(hasArtistPage bool) TagsBuilder {
|
func (g *getTags) Artist(hasArtistPage bool) TagsBuilder {
|
||||||
g.query["search[has_artist]"] = strconv.FormatBool(hasArtistPage)
|
g.query["search[has_artist]"] = strconv.FormatBool(hasArtistPage)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPage sets the query to retrieve tags from a specific page number.
|
// SetPage sets the query to retrieve tags from a specific page number.
|
||||||
func (g *getTags) SetPage(pageNumber int) TagsBuilder {
|
func (g *getTags) SetPage(pageNumber int) TagsBuilder {
|
||||||
g.query["page"] = strconv.Itoa(pageNumber)
|
g.query["page"] = strconv.Itoa(pageNumber)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of tags to retrieve.
|
// SetLimit sets the maximum number of tags to retrieve.
|
||||||
func (g *getTags) SetLimit(limitUser int) TagsBuilder {
|
func (g *getTags) SetLimit(limitUser int) TagsBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitUser)
|
g.query["limit"] = strconv.Itoa(limitUser)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns a slice of tags and an error, if any.
|
// Execute sends the constructed query and returns a slice of tags and an error, if any.
|
||||||
func (g *getTags) Execute() ([]model.Tag, error) {
|
func (g *getTags) Execute() ([]model.Tag, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tags, err := endpoints.GetTags(g.requestContext, g.query)
|
tags, err := endpoints.GetTags(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return tags, err
|
return tags, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,46 +1,46 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UserBuilder represents a builder for constructing queries to retrieve user information.
|
// UserBuilder represents a builder for constructing queries to retrieve user information.
|
||||||
type UserBuilder interface {
|
type UserBuilder interface {
|
||||||
// SetUsername sets the username for the query to retrieve user information.
|
// SetUsername sets the username for the query to retrieve user information.
|
||||||
SetUsername(username string) UserBuilder
|
SetUsername(username string) UserBuilder
|
||||||
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
||||||
Execute() (model.User, error)
|
Execute() (model.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetUserBuilder creates a new UserBuilder with the provided RequestContext.
|
// NewGetUserBuilder creates a new UserBuilder with the provided RequestContext.
|
||||||
func NewGetUserBuilder(requestContext model.RequestContext) UserBuilder {
|
func NewGetUserBuilder(requestContext model.RequestContext) UserBuilder {
|
||||||
return &getUser{requestContext: requestContext}
|
return &getUser{requestContext: requestContext}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getUser struct {
|
type getUser struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
username string
|
username string
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetUsername sets the username for the query to retrieve user information.
|
// SetUsername sets the username for the query to retrieve user information.
|
||||||
func (g *getUser) SetUsername(username string) UserBuilder {
|
func (g *getUser) SetUsername(username string) UserBuilder {
|
||||||
g.username = username
|
g.username = username
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
||||||
func (g *getUser) Execute() (model.User, error) {
|
func (g *getUser) Execute() (model.User, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.User{}, err
|
return model.User{}, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
user, err := endpoints.GetUser(g.requestContext, g.username)
|
user, err := endpoints.GetUser(g.requestContext, g.username)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.User{}, err
|
return model.User{}, err
|
||||||
}
|
}
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetUser(t *testing.T) {
|
func TestGetUser(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.User]("../../../tests/user.json")
|
response, err := utils.LoadJsonTestData[model.User]("../../../tests/user.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/users/MaxMustermannDer69ste.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/users/MaxMustermannDer69ste.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
GetUser := NewGetUserBuilder(requestContext)
|
GetUser := NewGetUserBuilder(requestContext)
|
||||||
user, err := GetUser.SetUsername("MaxMustermannDer69ste").Execute()
|
user, err := GetUser.SetUsername("MaxMustermannDer69ste").Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.ID == response.ID && user.Name == response.Name && user.CreatedAt == response.CreatedAt {
|
if user.ID == response.ID && user.Name == response.Name && user.CreatedAt == response.CreatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,127 +1,127 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UsersBuilder represents a builder for constructing queries to retrieve user information.
|
// UsersBuilder represents a builder for constructing queries to retrieve user information.
|
||||||
type UsersBuilder interface {
|
type UsersBuilder interface {
|
||||||
// SetPage sets the page number for paginated results.
|
// SetPage sets the page number for paginated results.
|
||||||
SetPage(pageNumber int) UsersBuilder
|
SetPage(pageNumber int) UsersBuilder
|
||||||
// SetLimit sets the maximum number of users to retrieve.
|
// SetLimit sets the maximum number of users to retrieve.
|
||||||
SetLimit(limitUser int) UsersBuilder
|
SetLimit(limitUser int) UsersBuilder
|
||||||
// SearchByName specifies a username to search for.
|
// SearchByName specifies a username to search for.
|
||||||
SearchByName(userName string) UsersBuilder
|
SearchByName(userName string) UsersBuilder
|
||||||
// SearchByAbout specifies a text to search in the 'about' field of user profiles.
|
// SearchByAbout specifies a text to search in the 'about' field of user profiles.
|
||||||
SearchByAbout(about string) UsersBuilder
|
SearchByAbout(about string) UsersBuilder
|
||||||
// SearchByAvatarID specifies an avatar ID to search for.
|
// SearchByAvatarID specifies an avatar ID to search for.
|
||||||
SearchByAvatarID(avatarID model.PostID) UsersBuilder
|
SearchByAvatarID(avatarID model.PostID) UsersBuilder
|
||||||
// SearchByLevel specifies a user level to filter by.
|
// SearchByLevel specifies a user level to filter by.
|
||||||
SearchByLevel(level model.UserLevel) UsersBuilder
|
SearchByLevel(level model.UserLevel) UsersBuilder
|
||||||
// SearchByMinLevel specifies the minimum user level to filter by.
|
// SearchByMinLevel specifies the minimum user level to filter by.
|
||||||
SearchByMinLevel(minLevel model.UserLevel) UsersBuilder
|
SearchByMinLevel(minLevel model.UserLevel) UsersBuilder
|
||||||
// SearchByMaxLevel specifies the maximum user level to filter by.
|
// SearchByMaxLevel specifies the maximum user level to filter by.
|
||||||
SearchByMaxLevel(maxLevel model.UserLevel) UsersBuilder
|
SearchByMaxLevel(maxLevel model.UserLevel) UsersBuilder
|
||||||
// SearchByCanUpload specifies whether users can upload free content.
|
// SearchByCanUpload specifies whether users can upload free content.
|
||||||
SearchByCanUpload(canUpload bool) UsersBuilder
|
SearchByCanUpload(canUpload bool) UsersBuilder
|
||||||
// SearchByIsApprover specifies whether users can approve posts.
|
// SearchByIsApprover specifies whether users can approve posts.
|
||||||
SearchByIsApprover(isApprover bool) UsersBuilder
|
SearchByIsApprover(isApprover bool) UsersBuilder
|
||||||
// SearchByOrder specifies the order in which users are retrieved.
|
// SearchByOrder specifies the order in which users are retrieved.
|
||||||
SearchByOrder(order model.Order) UsersBuilder
|
SearchByOrder(order model.Order) UsersBuilder
|
||||||
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
||||||
Execute() ([]model.User, error)
|
Execute() ([]model.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGetUsersBuilder creates a new UsersBuilder with the provided RequestContext.
|
// NewGetUsersBuilder creates a new UsersBuilder with the provided RequestContext.
|
||||||
func NewGetUsersBuilder(requestContext model.RequestContext) UsersBuilder {
|
func NewGetUsersBuilder(requestContext model.RequestContext) UsersBuilder {
|
||||||
return &getUsers{requestContext: requestContext, query: make(map[string]string)}
|
return &getUsers{requestContext: requestContext, query: make(map[string]string)}
|
||||||
}
|
}
|
||||||
|
|
||||||
type getUsers struct {
|
type getUsers struct {
|
||||||
requestContext model.RequestContext
|
requestContext model.RequestContext
|
||||||
query map[string]string
|
query map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByName specifies a username to search for.
|
// SearchByName specifies a username to search for.
|
||||||
func (g *getUsers) SearchByName(userName string) UsersBuilder {
|
func (g *getUsers) SearchByName(userName string) UsersBuilder {
|
||||||
g.query["search[name_matches]"] = userName
|
g.query["search[name_matches]"] = userName
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByAbout specifies a text to search in the 'about' field of user profiles.
|
// SearchByAbout specifies a text to search in the 'about' field of user profiles.
|
||||||
func (g *getUsers) SearchByAbout(about string) UsersBuilder {
|
func (g *getUsers) SearchByAbout(about string) UsersBuilder {
|
||||||
g.query["search[about_me]"] = about
|
g.query["search[about_me]"] = about
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByAvatarID specifies an avatar ID to search for.
|
// SearchByAvatarID specifies an avatar ID to search for.
|
||||||
func (g *getUsers) SearchByAvatarID(avatarID model.PostID) UsersBuilder {
|
func (g *getUsers) SearchByAvatarID(avatarID model.PostID) UsersBuilder {
|
||||||
g.query["search[avatar_id]"] = strconv.FormatInt(int64(avatarID), 10)
|
g.query["search[avatar_id]"] = strconv.FormatInt(int64(avatarID), 10)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByLevel specifies a user level to filter by.
|
// SearchByLevel specifies a user level to filter by.
|
||||||
func (g *getUsers) SearchByLevel(level model.UserLevel) UsersBuilder {
|
func (g *getUsers) SearchByLevel(level model.UserLevel) UsersBuilder {
|
||||||
g.query["search[level]"] = strconv.Itoa(int(level))
|
g.query["search[level]"] = strconv.Itoa(int(level))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByMinLevel specifies the minimum user level to filter by.
|
// SearchByMinLevel specifies the minimum user level to filter by.
|
||||||
func (g *getUsers) SearchByMinLevel(minLevel model.UserLevel) UsersBuilder {
|
func (g *getUsers) SearchByMinLevel(minLevel model.UserLevel) UsersBuilder {
|
||||||
g.query["search[min_level]"] = strconv.Itoa(int(minLevel))
|
g.query["search[min_level]"] = strconv.Itoa(int(minLevel))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByMaxLevel specifies the maximum user level to filter by.
|
// SearchByMaxLevel specifies the maximum user level to filter by.
|
||||||
func (g *getUsers) SearchByMaxLevel(maxLevel model.UserLevel) UsersBuilder {
|
func (g *getUsers) SearchByMaxLevel(maxLevel model.UserLevel) UsersBuilder {
|
||||||
g.query["search[max_level]"] = strconv.Itoa(int(maxLevel))
|
g.query["search[max_level]"] = strconv.Itoa(int(maxLevel))
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByCanUpload specifies whether users can upload free content.
|
// SearchByCanUpload specifies whether users can upload free content.
|
||||||
func (g *getUsers) SearchByCanUpload(canUpload bool) UsersBuilder {
|
func (g *getUsers) SearchByCanUpload(canUpload bool) UsersBuilder {
|
||||||
g.query["search[can_upload_free]"] = strconv.FormatBool(canUpload)
|
g.query["search[can_upload_free]"] = strconv.FormatBool(canUpload)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByIsApprover specifies whether users can approve posts.
|
// SearchByIsApprover specifies whether users can approve posts.
|
||||||
func (g *getUsers) SearchByIsApprover(isApprover bool) UsersBuilder {
|
func (g *getUsers) SearchByIsApprover(isApprover bool) UsersBuilder {
|
||||||
g.query["search[can_approve_posts]"] = strconv.FormatBool(isApprover)
|
g.query["search[can_approve_posts]"] = strconv.FormatBool(isApprover)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByOrder specifies the order in which users are retrieved.
|
// SearchByOrder specifies the order in which users are retrieved.
|
||||||
func (g *getUsers) SearchByOrder(order model.Order) UsersBuilder {
|
func (g *getUsers) SearchByOrder(order model.Order) UsersBuilder {
|
||||||
g.query["search[order]"] = string(order)
|
g.query["search[order]"] = string(order)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPage sets the page number for paginated results.
|
// SetPage sets the page number for paginated results.
|
||||||
func (g *getUsers) SetPage(pageNumber int) UsersBuilder {
|
func (g *getUsers) SetPage(pageNumber int) UsersBuilder {
|
||||||
g.query["page"] = strconv.Itoa(pageNumber)
|
g.query["page"] = strconv.Itoa(pageNumber)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLimit sets the maximum number of users to retrieve.
|
// SetLimit sets the maximum number of users to retrieve.
|
||||||
func (g *getUsers) SetLimit(limitUser int) UsersBuilder {
|
func (g *getUsers) SetLimit(limitUser int) UsersBuilder {
|
||||||
g.query["limit"] = strconv.Itoa(limitUser)
|
g.query["limit"] = strconv.Itoa(limitUser)
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
// Execute sends the constructed query and returns the requested user information and an error, if any.
|
||||||
func (g *getUsers) Execute() ([]model.User, error) {
|
func (g *getUsers) Execute() ([]model.User, error) {
|
||||||
if g.requestContext.RateLimiter != nil {
|
if g.requestContext.RateLimiter != nil {
|
||||||
err := g.requestContext.RateLimiter.Wait(context.Background())
|
err := g.requestContext.RateLimiter.Wait(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
users, err := endpoints.GetUsers(g.requestContext, g.query)
|
users, err := endpoints.GetUsers(g.requestContext, g.query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return users, nil
|
return users, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetUsers(t *testing.T) {
|
func TestGetUsers(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.User]("../../../tests/users.json")
|
response, err := utils.LoadJsonTestData[[]model.User]("../../../tests/users.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responser, err := httpmock.NewJsonResponder(200, response)
|
responser, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/users.json", responser)
|
httpmock.RegisterResponder("GET", "https://e621.net/users.json", responser)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
getUsers := NewGetUsersBuilder(requestContext)
|
getUsers := NewGetUsersBuilder(requestContext)
|
||||||
user, err := getUsers.Execute()
|
user, err := getUsers.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if user[0].ID == response[0].ID && user[1].Name == response[1].Name {
|
if user[0].ID == response[0].ID && user[1].Name == response[1].Name {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,244 +1,244 @@
|
||||||
package e621
|
package e621
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/builder"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
_ "github.com/joho/godotenv/autoload"
|
_ "github.com/joho/godotenv/autoload"
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client is the main client for interacting with the e621 API.
|
// Client is the main client for interacting with the e621 API.
|
||||||
type Client struct {
|
type Client struct {
|
||||||
RequestContext model.RequestContext
|
RequestContext model.RequestContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient creates a new e621 client with the provided username and API key.
|
// NewClient creates a new e621 client with the provided username and API key.
|
||||||
func NewClient(username string, apiKey string) Client {
|
func NewClient(username string, apiKey string) Client {
|
||||||
// Create a new e621 client with the given username and API key.
|
// Create a new e621 client with the given username and API key.
|
||||||
return Client{
|
return Client{
|
||||||
RequestContext: model.RequestContext{
|
RequestContext: model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
RateLimiter: rate.NewLimiter(1, 2),
|
RateLimiter: rate.NewLimiter(1, 2),
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: fmt.Sprintf("Go-e621-SDK used by %s | (made by the Anthrove Team)", username),
|
UserAgent: fmt.Sprintf("Go-e621-SDK used by %s | (made by the Anthrove Team)", username),
|
||||||
Username: username,
|
Username: username,
|
||||||
APIKey: apiKey,
|
APIKey: apiKey,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserBuilder returns a UserBuilder instance for creating and executing requests to retrieve user information from the e621 API.
|
// GetUserBuilder returns a UserBuilder instance for creating and executing requests to retrieve user information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.UserBuilder: An instance of the UserBuilder.
|
// - builder.UserBuilder: An instance of the UserBuilder.
|
||||||
func (c *Client) GetUserBuilder() builder.UserBuilder {
|
func (c *Client) GetUserBuilder() builder.UserBuilder {
|
||||||
return builder.NewGetUserBuilder(c.RequestContext)
|
return builder.NewGetUserBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsersBuilder returns a UsersBuilder instance for creating and executing requests to retrieve multiple users' information from the e621 API.
|
// GetUsersBuilder returns a UsersBuilder instance for creating and executing requests to retrieve multiple users' information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.UsersBuilder: An instance of the UsersBuilder.
|
// - builder.UsersBuilder: An instance of the UsersBuilder.
|
||||||
func (c *Client) GetUsersBuilder() builder.UsersBuilder {
|
func (c *Client) GetUsersBuilder() builder.UsersBuilder {
|
||||||
return builder.NewGetUsersBuilder(c.RequestContext)
|
return builder.NewGetUsersBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFavoritesBuilder returns a FavoritesBuilder instance for creating and executing requests to retrieve a user's favorite posts from the e621 API.
|
// GetFavoritesBuilder returns a FavoritesBuilder instance for creating and executing requests to retrieve a user's favorite posts from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.FavoritesBuilder: An instance of the FavoritesBuilder.
|
// - builder.FavoritesBuilder: An instance of the FavoritesBuilder.
|
||||||
func (c *Client) GetFavoritesBuilder() builder.FavoritesBuilder {
|
func (c *Client) GetFavoritesBuilder() builder.FavoritesBuilder {
|
||||||
return builder.NewGetFavoritesBuilder(c.RequestContext)
|
return builder.NewGetFavoritesBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPostBuilder returns a PostBuilder instance for creating and executing requests to retrieve post information from the e621 API.
|
// GetPostBuilder returns a PostBuilder instance for creating and executing requests to retrieve post information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.PostBuilder: An instance of the PostBuilder.
|
// - builder.PostBuilder: An instance of the PostBuilder.
|
||||||
func (c *Client) GetPostBuilder() builder.PostBuilder {
|
func (c *Client) GetPostBuilder() builder.PostBuilder {
|
||||||
return builder.NewGetPostBuilder(c.RequestContext)
|
return builder.NewGetPostBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPostsBuilder returns a PostsBuilder instance for creating and executing requests to retrieve multiple posts' information from the e621 API.
|
// GetPostsBuilder returns a PostsBuilder instance for creating and executing requests to retrieve multiple posts' information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.PostsBuilder: An instance of the PostsBuilder.
|
// - builder.PostsBuilder: An instance of the PostsBuilder.
|
||||||
func (c *Client) GetPostsBuilder() builder.PostsBuilder {
|
func (c *Client) GetPostsBuilder() builder.PostsBuilder {
|
||||||
return builder.NewGetPostsBuilder(c.RequestContext)
|
return builder.NewGetPostsBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNoteBuilder returns a NoteBuilder instance for creating and executing requests to retrieve note information from the e621 API.
|
// GetNoteBuilder returns a NoteBuilder instance for creating and executing requests to retrieve note information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.NoteBuilder: An instance of the NoteBuilder.
|
// - builder.NoteBuilder: An instance of the NoteBuilder.
|
||||||
func (c *Client) GetNoteBuilder() builder.NoteBuilder {
|
func (c *Client) GetNoteBuilder() builder.NoteBuilder {
|
||||||
return builder.NewGetNoteBuilder(c.RequestContext)
|
return builder.NewGetNoteBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNotesBuilder returns a NotesBuilder instance for creating and executing requests to retrieve multiple notes' information from the e621 API.
|
// GetNotesBuilder returns a NotesBuilder instance for creating and executing requests to retrieve multiple notes' information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.NotesBuilder: An instance of the NotesBuilder.
|
// - builder.NotesBuilder: An instance of the NotesBuilder.
|
||||||
func (c *Client) GetNotesBuilder() builder.NotesBuilder {
|
func (c *Client) GetNotesBuilder() builder.NotesBuilder {
|
||||||
return builder.NewGetNotesBuilder(c.RequestContext)
|
return builder.NewGetNotesBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPoolBuilder returns a PoolBuilder instance for creating and executing requests to retrieve pool information from the e621 API.
|
// GetPoolBuilder returns a PoolBuilder instance for creating and executing requests to retrieve pool information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.PoolBuilder: An instance of the PoolBuilder.
|
// - builder.PoolBuilder: An instance of the PoolBuilder.
|
||||||
func (c *Client) GetPoolBuilder() builder.PoolBuilder {
|
func (c *Client) GetPoolBuilder() builder.PoolBuilder {
|
||||||
return builder.NewGetPoolBuilder(c.RequestContext)
|
return builder.NewGetPoolBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPoolsBuilder returns a PoolsBuilder instance for creating and executing requests to retrieve multiple pools' information from the e621 API.
|
// GetPoolsBuilder returns a PoolsBuilder instance for creating and executing requests to retrieve multiple pools' information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.PoolsBuilder: An instance of the PoolsBuilder.
|
// - builder.PoolsBuilder: An instance of the PoolsBuilder.
|
||||||
func (c *Client) GetPoolsBuilder() builder.PoolsBuilder {
|
func (c *Client) GetPoolsBuilder() builder.PoolsBuilder {
|
||||||
return builder.NewGetPoolsBuilder(c.RequestContext)
|
return builder.NewGetPoolsBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTagBuilder returns a TagBuilder instance for creating and executing requests to retrieve tag information from the e621 API.
|
// GetTagBuilder returns a TagBuilder instance for creating and executing requests to retrieve tag information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.TagBuilder: An instance of the TagBuilder.
|
// - builder.TagBuilder: An instance of the TagBuilder.
|
||||||
func (c *Client) GetTagBuilder() builder.TagBuilder {
|
func (c *Client) GetTagBuilder() builder.TagBuilder {
|
||||||
return builder.NewGetTagBuilder(c.RequestContext)
|
return builder.NewGetTagBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTagsBuilder returns a TagsBuilder instance for creating and executing requests to retrieve multiple tags' information from the e621 API.
|
// GetTagsBuilder returns a TagsBuilder instance for creating and executing requests to retrieve multiple tags' information from the e621 API.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - builder.TagsBuilder: An instance of the TagsBuilder.
|
// - builder.TagsBuilder: An instance of the TagsBuilder.
|
||||||
func (c *Client) GetTagsBuilder() builder.TagsBuilder {
|
func (c *Client) GetTagsBuilder() builder.TagsBuilder {
|
||||||
return builder.NewGetTagsBuilder(c.RequestContext)
|
return builder.NewGetTagsBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetHost sets the API host for the client.
|
// SetHost sets the API host for the client.
|
||||||
func (c *Client) SetHost(host string) *Client {
|
func (c *Client) SetHost(host string) *Client {
|
||||||
// Set the API host for the client.
|
// Set the API host for the client.
|
||||||
c.RequestContext.Host = host
|
c.RequestContext.Host = host
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAgentName sets the user agent name for the client.
|
// SetAgentName sets the user agent name for the client.
|
||||||
func (c *Client) SetAgentName(userAgent string) *Client {
|
func (c *Client) SetAgentName(userAgent string) *Client {
|
||||||
// Set the user agent name for the client.
|
// Set the user agent name for the client.
|
||||||
c.RequestContext.UserAgent = userAgent
|
c.RequestContext.UserAgent = userAgent
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserByName returns a user builder for a given username.
|
// GetUserByName returns a user builder for a given username.
|
||||||
func (c *Client) GetUserByName(username string) builder.UserBuilder {
|
func (c *Client) GetUserByName(username string) builder.UserBuilder {
|
||||||
// Returns a user builder for the specified username.
|
// Returns a user builder for the specified username.
|
||||||
return builder.NewGetUserBuilder(c.RequestContext).SetUsername(username)
|
return builder.NewGetUserBuilder(c.RequestContext).SetUsername(username)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserByID returns a user builder for a given user ID.
|
// GetUserByID returns a user builder for a given user ID.
|
||||||
func (c *Client) GetUserByID(userID model.UserID) builder.UserBuilder {
|
func (c *Client) GetUserByID(userID model.UserID) builder.UserBuilder {
|
||||||
// Returns a user builder for the specified user ID.
|
// Returns a user builder for the specified user ID.
|
||||||
return builder.NewGetUserBuilder(c.RequestContext).SetUsername(strconv.FormatInt(int64(userID), 10))
|
return builder.NewGetUserBuilder(c.RequestContext).SetUsername(strconv.FormatInt(int64(userID), 10))
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFavoritesForUser returns a favorites builder for a given username.
|
// GetFavoritesForUser returns a favorites builder for a given username.
|
||||||
func (c *Client) GetFavoritesForUser(username string) (builder.FavoritesBuilder, error) {
|
func (c *Client) GetFavoritesForUser(username string) (builder.FavoritesBuilder, error) {
|
||||||
// Returns a favorites builder for the specified username.
|
// Returns a favorites builder for the specified username.
|
||||||
user, err := builder.NewGetUserBuilder(c.RequestContext).SetUsername(username).Execute()
|
user, err := builder.NewGetUserBuilder(c.RequestContext).SetUsername(username).Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
favoritesBuilder := builder.NewGetFavoritesBuilder(c.RequestContext).SetUserID(user.ID)
|
favoritesBuilder := builder.NewGetFavoritesBuilder(c.RequestContext).SetUserID(user.ID)
|
||||||
return favoritesBuilder, nil
|
return favoritesBuilder, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNFavoritesForUser retrieves a specified number of favorites for a user.
|
// GetNFavoritesForUser retrieves a specified number of favorites for a user.
|
||||||
func (c *Client) GetNFavoritesForUser(n int, favoriteBuilder builder.FavoritesBuilder) ([]model.Post, error) {
|
func (c *Client) GetNFavoritesForUser(n int, favoriteBuilder builder.FavoritesBuilder) ([]model.Post, error) {
|
||||||
// Retrieves a specified number of favorite posts for a user.
|
// Retrieves a specified number of favorite posts for a user.
|
||||||
if n < utils.E621_MAX_POST_COUNT {
|
if n < utils.E621_MAX_POST_COUNT {
|
||||||
favoriteBuilder.SetLimit(n)
|
favoriteBuilder.SetLimit(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
var favorites []model.Post
|
var favorites []model.Post
|
||||||
var page = 1
|
var page = 1
|
||||||
for len(favorites) < n {
|
for len(favorites) < n {
|
||||||
favoriteBuilder.Page(page)
|
favoriteBuilder.Page(page)
|
||||||
favoriteBuilder.SetLimit(n - len(favorites))
|
favoriteBuilder.SetLimit(n - len(favorites))
|
||||||
newFavorites, err := favoriteBuilder.Execute()
|
newFavorites, err := favoriteBuilder.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(newFavorites) == 0 {
|
if len(newFavorites) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
favorites = append(favorites, newFavorites...)
|
favorites = append(favorites, newFavorites...)
|
||||||
page = page + 1
|
page = page + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return favorites, nil
|
return favorites, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAllFavoritesForUser retrieves all favorites for a user.
|
// GetAllFavoritesForUser retrieves all favorites for a user.
|
||||||
func (c *Client) GetAllFavoritesForUser(favoriteBuilder builder.FavoritesBuilder) ([]model.Post, error) {
|
func (c *Client) GetAllFavoritesForUser(favoriteBuilder builder.FavoritesBuilder) ([]model.Post, error) {
|
||||||
// Retrieves all favorite posts for a user.
|
// Retrieves all favorite posts for a user.
|
||||||
return c.GetNFavoritesForUser(math.MaxInt, favoriteBuilder)
|
return c.GetNFavoritesForUser(math.MaxInt, favoriteBuilder)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFavoritesForUserWithTags returns a posts builder for a user's favorites with specific tags.
|
// GetFavoritesForUserWithTags returns a posts builder for a user's favorites with specific tags.
|
||||||
func (c *Client) GetFavoritesForUserWithTags(username string, tags string) builder.PostsBuilder {
|
func (c *Client) GetFavoritesForUserWithTags(username string, tags string) builder.PostsBuilder {
|
||||||
// Returns a posts builder for a user's favorites with specific tags.
|
// Returns a posts builder for a user's favorites with specific tags.
|
||||||
favoritesBuilder := builder.NewGetPostsBuilder(c.RequestContext).Tags(fmt.Sprintf("fav:%s %s", username, tags))
|
favoritesBuilder := builder.NewGetPostsBuilder(c.RequestContext).Tags(fmt.Sprintf("fav:%s %s", username, tags))
|
||||||
return favoritesBuilder
|
return favoritesBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPostByID returns a post builder for a specific post ID.
|
// GetPostByID returns a post builder for a specific post ID.
|
||||||
func (c *Client) GetPostByID(id model.PostID) builder.PostBuilder {
|
func (c *Client) GetPostByID(id model.PostID) builder.PostBuilder {
|
||||||
// Returns a post builder for a specific post ID.
|
// Returns a post builder for a specific post ID.
|
||||||
return builder.NewGetPostBuilder(c.RequestContext).SetPostID(id)
|
return builder.NewGetPostBuilder(c.RequestContext).SetPostID(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPosts returns a posts builder for general post queries.
|
// GetPosts returns a posts builder for general post queries.
|
||||||
func (c *Client) GetPosts() builder.PostsBuilder {
|
func (c *Client) GetPosts() builder.PostsBuilder {
|
||||||
// Returns a posts builder for general post queries.
|
// Returns a posts builder for general post queries.
|
||||||
return builder.NewGetPostsBuilder(c.RequestContext)
|
return builder.NewGetPostsBuilder(c.RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNPosts retrieves a specified number of posts.
|
// GetNPosts retrieves a specified number of posts.
|
||||||
func (c *Client) GetNPosts(n int, postBuilder builder.PostsBuilder) ([]model.Post, error) {
|
func (c *Client) GetNPosts(n int, postBuilder builder.PostsBuilder) ([]model.Post, error) {
|
||||||
// Retrieves a specified number of posts using the provided post builder.
|
// Retrieves a specified number of posts using the provided post builder.
|
||||||
if n < utils.E621_MAX_POST_COUNT {
|
if n < utils.E621_MAX_POST_COUNT {
|
||||||
postBuilder.SetLimit(n)
|
postBuilder.SetLimit(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
posts, err := postBuilder.Execute()
|
posts, err := postBuilder.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for len(posts) < n {
|
for len(posts) < n {
|
||||||
lastPostID := posts[len(posts)-1].ID
|
lastPostID := posts[len(posts)-1].ID
|
||||||
postBuilder.PageBefore(lastPostID)
|
postBuilder.PageBefore(lastPostID)
|
||||||
postBuilder.SetLimit(n - len(posts))
|
postBuilder.SetLimit(n - len(posts))
|
||||||
newPosts, err := postBuilder.Execute()
|
newPosts, err := postBuilder.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(newPosts) == 0 {
|
if len(newPosts) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
posts = append(posts, newPosts...)
|
posts = append(posts, newPosts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return posts, nil
|
return posts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAllPosts retrieves all available posts using the provided post builder.
|
// GetAllPosts retrieves all available posts using the provided post builder.
|
||||||
func (c *Client) GetAllPosts(postBuilder builder.PostsBuilder) ([]model.Post, error) {
|
func (c *Client) GetAllPosts(postBuilder builder.PostsBuilder) ([]model.Post, error) {
|
||||||
// Retrieves all available posts using the provided post builder.
|
// Retrieves all available posts using the provided post builder.
|
||||||
return c.GetNPosts(math.MaxInt, postBuilder)
|
return c.GetNPosts(math.MaxInt, postBuilder)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,117 +1,117 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"golang.org/x/net/html"
|
"golang.org/x/net/html"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetDBExportList retrieves a list of files available in the e621 database export.
|
// GetDBExportList retrieves a list of files available in the e621 database export.
|
||||||
//
|
//
|
||||||
// This function performs an HTTP GET request to the e621 database export endpoint and parses
|
// This function performs an HTTP GET request to the e621 database export endpoint and parses
|
||||||
// the HTML content to extract the links to export files with the ".csv.gz" extension.
|
// the HTML content to extract the links to export files with the ".csv.gz" extension.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []string: A slice of file names with the ".csv.gz" extension.
|
// - []string: A slice of file names with the ".csv.gz" extension.
|
||||||
// - error: An error, if any, encountered during the API request, response handling, or HTML parsing.
|
// - error: An error, if any, encountered during the API request, response handling, or HTML parsing.
|
||||||
func GetDBExportList(requestContext model.RequestContext) ([]string, error) {
|
func GetDBExportList(requestContext model.RequestContext) ([]string, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("https://e621.net/db_export/"), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("https://e621.net/db_export/"), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the HTML content
|
// Parse the HTML content
|
||||||
tokenizer := html.NewTokenizer(resp.Body)
|
tokenizer := html.NewTokenizer(resp.Body)
|
||||||
var files []string
|
var files []string
|
||||||
|
|
||||||
// Iterate through the HTML tokens
|
// Iterate through the HTML tokens
|
||||||
for {
|
for {
|
||||||
tokenType := tokenizer.Next()
|
tokenType := tokenizer.Next()
|
||||||
|
|
||||||
switch tokenType {
|
switch tokenType {
|
||||||
case html.ErrorToken:
|
case html.ErrorToken:
|
||||||
// End of the HTML document
|
// End of the HTML document
|
||||||
return files, nil
|
return files, nil
|
||||||
case html.StartTagToken, html.SelfClosingTagToken:
|
case html.StartTagToken, html.SelfClosingTagToken:
|
||||||
token := tokenizer.Token()
|
token := tokenizer.Token()
|
||||||
if token.Data == "a" {
|
if token.Data == "a" {
|
||||||
// Check if the anchor tag has an href attribute
|
// Check if the anchor tag has an href attribute
|
||||||
for _, attr := range token.Attr {
|
for _, attr := range token.Attr {
|
||||||
if attr.Key == "href" {
|
if attr.Key == "href" {
|
||||||
// Filter out the parent directory link and only add links with ".csv.gz" extension
|
// Filter out the parent directory link and only add links with ".csv.gz" extension
|
||||||
if !strings.HasPrefix(attr.Val, "../") && strings.HasSuffix(attr.Val, ".csv.gz") {
|
if !strings.HasPrefix(attr.Val, "../") && strings.HasSuffix(attr.Val, ".csv.gz") {
|
||||||
files = append(files, attr.Val)
|
files = append(files, attr.Val)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDBExportFile retrieves a specific file from the e621 database export.
|
// GetDBExportFile retrieves a specific file from the e621 database export.
|
||||||
//
|
//
|
||||||
// This function performs an HTTP GET request to the e621 database export endpoint to fetch a
|
// This function performs an HTTP GET request to the e621 database export endpoint to fetch a
|
||||||
// particular file identified by its name.
|
// particular file identified by its name.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - file: The name of the file to be fetched from the database export.
|
// - file: The name of the file to be fetched from the database export.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - *http.Response: The HTTP response containing the requested file (probably a csv.gz).
|
// - *http.Response: The HTTP response containing the requested file (probably a csv.gz).
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetDBExportFile(requestContext model.RequestContext, file string) (*http.Response, error) {
|
func GetDBExportFile(requestContext model.RequestContext, file string) (*http.Response, error) {
|
||||||
if file == "" {
|
if file == "" {
|
||||||
return nil, fmt.Errorf("no file specified")
|
return nil, fmt.Errorf("no file specified")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("https://e621.net/db_export/%s", file), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("https://e621.net/db_export/%s", file), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
234
pkg/e621/endpoints/dmail.go
Normal file
234
pkg/e621/endpoints/dmail.go
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
package endpoints
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetDmail retrieves a specific DMail by its ID.
|
||||||
|
//
|
||||||
|
// This function performs an HTTP GET request to the e621 DMail endpoint and parses
|
||||||
|
// the JSON content to extract the DMail data.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - requestContext: The model.RequestContext for the API request.
|
||||||
|
// - ID: The ID of the DMail to be fetched.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - model.DMail: A struct containing the DMail data.
|
||||||
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
|
func GetDmail(requestContext model.RequestContext, ID int) (model.DMail, error) {
|
||||||
|
// Create a new HTTP GET request to fetch the post information.
|
||||||
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/dmails/%d.json", requestContext.Host, ID), nil)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
|
return model.DMail{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
|
// Send the request using the provided http.Client.
|
||||||
|
resp, err := requestContext.Client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
|
return model.DMail{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
|
return model.DMail{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize a Post struct to store the response data.
|
||||||
|
var postResponse model.DMail
|
||||||
|
|
||||||
|
// Decode the JSON response into the PostResponse struct.
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
|
return model.DMail{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the post information and no error (nil).
|
||||||
|
return postResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteDmail deletes a specific DMail by its ID.
|
||||||
|
//
|
||||||
|
// This function performs an HTTP DELETE request to the e621 DMail endpoint.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - requestContext: The model.RequestContext for the API request.
|
||||||
|
// - ID: The ID of the DMail to be deleted.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
|
func DeleteDmail(requestContext model.RequestContext, ID int) error {
|
||||||
|
// Create a new HTTP GET request to fetch the post information.
|
||||||
|
r, err := http.NewRequest("DELETE", fmt.Sprintf("%s/dmails/%d.json", requestContext.Host, ID), nil)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
|
// Send the request using the provided http.Client.
|
||||||
|
resp, err := requestContext.Client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
|
return utils.StatusCodesToError(resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the post information and no error (nil).
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarkAsReadDmail marks a specific DMail as read by its ID.
|
||||||
|
//
|
||||||
|
// This function performs an HTTP PUT request to the e621 DMail endpoint.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - requestContext: The model.RequestContext for the API request.
|
||||||
|
// - ID: The ID of the DMail to be marked as read.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
|
func MarkAsReadDmail(requestContext model.RequestContext, ID int) error {
|
||||||
|
// Create a new HTTP GET request to fetch the post information.
|
||||||
|
r, err := http.NewRequest("PUT", fmt.Sprintf("%s/dmails/%d/mark_as_read.json", requestContext.Host, ID), nil)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
|
// Send the request using the provided http.Client.
|
||||||
|
resp, err := requestContext.Client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
|
return utils.StatusCodesToError(resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the post information and no error (nil).
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllDmails retrieves all DMails.
|
||||||
|
//
|
||||||
|
// This function performs an HTTP GET request to the e621 DMail endpoint and parses
|
||||||
|
// the JSON content to extract the DMail data.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - requestContext: The model.RequestContext for the API request.
|
||||||
|
// - query: A map containing the query parameters for the request.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - []model.DMail: A slice of structs containing the DMail data.
|
||||||
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
|
func GetAllDmails(requestContext model.RequestContext, query map[string]string) ([]model.DMail, error) {
|
||||||
|
// Create a new HTTP GET request.
|
||||||
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/dmails.json", requestContext.Host), nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append query parameters to the request URL.
|
||||||
|
q := r.URL.Query()
|
||||||
|
for k, v := range query {
|
||||||
|
q.Add(k, v)
|
||||||
|
}
|
||||||
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
|
// Send the request using the provided http.Client.
|
||||||
|
resp, err := requestContext.Client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize a slice of Post struct to store the response data.
|
||||||
|
var postResponse []model.DMail
|
||||||
|
|
||||||
|
// Decode the JSON response into the PostResponse struct.
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
|
return []model.DMail{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the list of posts and no error (nil).
|
||||||
|
return postResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarkAsReadAllDmails marks all DMails as read.
|
||||||
|
//
|
||||||
|
// This function performs an HTTP PUT request to the e621 DMail endpoint.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - requestContext: The model.RequestContext for the API request.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
|
func MarkAsReadAllDmails(requestContext model.RequestContext) error {
|
||||||
|
// Create a new HTTP GET request to fetch the post information.
|
||||||
|
r, err := http.NewRequest("PUT", fmt.Sprintf("%s/dmails/mark_all_as_read.json", requestContext.Host), nil)
|
||||||
|
|
||||||
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
|
// Send the request using the provided http.Client.
|
||||||
|
resp, err := requestContext.Client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
|
return utils.StatusCodesToError(resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the post information and no error (nil).
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,64 +1,64 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetFavorites retrieves a user's favorite posts from the e621 API.
|
// GetFavorites retrieves a user's favorite posts from the e621 API.
|
||||||
//
|
//
|
||||||
// The user_id parameter is required to get the favorites of a user.
|
// The user_id parameter is required to get the favorites of a user.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.Post: A slice of favorite posts.
|
// - []model.Post: A slice of favorite posts.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetFavorites(requestContext model.RequestContext, query map[string]string) ([]model.Post, error) {
|
func GetFavorites(requestContext model.RequestContext, query map[string]string) ([]model.Post, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/favorites.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/favorites.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a User struct to store the response data.
|
// Initialize a User struct to store the response data.
|
||||||
var favoriteResponse model.PostResponse
|
var favoriteResponse model.PostResponse
|
||||||
|
|
||||||
// Decode the JSON response into the user struct.
|
// Decode the JSON response into the user struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&favoriteResponse)
|
err = json.NewDecoder(resp.Body).Decode(&favoriteResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty User struct and the error.
|
// Log the error and return an empty User struct and the error.
|
||||||
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return favoriteResponse.Posts, nil
|
return favoriteResponse.Posts, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetFavorites(t *testing.T) {
|
func TestGetFavorites(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/favorites.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/favorites.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
posts, err := GetFavorites(requestContext, map[string]string{})
|
posts, err := GetFavorites(requestContext, map[string]string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,121 +1,121 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetNote retrieves a single note by its ID from the e621 API.
|
// GetNote retrieves a single note by its ID from the e621 API.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - ID: The ID of the note to retrieve.
|
// - ID: The ID of the note to retrieve.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - model.Note: The retrieved note.
|
// - model.Note: The retrieved note.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetNote(requestContext model.RequestContext, ID string) (model.Note, error) {
|
func GetNote(requestContext model.RequestContext, ID string) (model.Note, error) {
|
||||||
// Create a new HTTP GET request to fetch the note information.
|
// Create a new HTTP GET request to fetch the note information.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/notes/%s.json", requestContext.Host, ID), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/notes/%s.json", requestContext.Host, ID), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Note struct and the error.
|
// Log the error and return an empty Note struct and the error.
|
||||||
|
|
||||||
return model.Note{}, err
|
return model.Note{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Note struct and the error.
|
// Log the error and return an empty Note struct and the error.
|
||||||
|
|
||||||
return model.Note{}, err
|
return model.Note{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return model.Note{}, utils.StatusCodesToError(resp.StatusCode)
|
return model.Note{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a Note struct to store the response data.
|
// Initialize a Note struct to store the response data.
|
||||||
var noteResponse model.Note
|
var noteResponse model.Note
|
||||||
|
|
||||||
// Decode the JSON response into the Note struct.
|
// Decode the JSON response into the Note struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(¬eResponse)
|
err = json.NewDecoder(resp.Body).Decode(¬eResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Note struct and the error.
|
// Log the error and return an empty Note struct and the error.
|
||||||
|
|
||||||
return model.Note{}, err
|
return model.Note{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the note information and no error (nil).
|
// Return the note information and no error (nil).
|
||||||
return noteResponse, nil
|
return noteResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNotes retrieves a list of notes from the e621 API based on query parameters.
|
// GetNotes retrieves a list of notes from the e621 API based on query parameters.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.Note: A slice of notes.
|
// - []model.Note: A slice of notes.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetNotes(requestContext model.RequestContext, query map[string]string) ([]model.Note, error) {
|
func GetNotes(requestContext model.RequestContext, query map[string]string) ([]model.Note, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/notes.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/notes.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
respBodyBytes, err := io.ReadAll(resp.Body)
|
respBodyBytes, err := io.ReadAll(resp.Body)
|
||||||
if strings.Contains(string(respBodyBytes), "{\"notes\":[]}") {
|
if strings.Contains(string(respBodyBytes), "{\"notes\":[]}") {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a slice of Note struct to store the response data.
|
// Initialize a slice of Note struct to store the response data.
|
||||||
var notesResponse []model.Note
|
var notesResponse []model.Note
|
||||||
|
|
||||||
// Decode the JSON response into the slice of Note structs.
|
// Decode the JSON response into the slice of Note structs.
|
||||||
err = json.Unmarshal(respBodyBytes, ¬esResponse)
|
err = json.Unmarshal(respBodyBytes, ¬esResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty slice and the error.
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the list of notes and no error (nil).
|
// Return the list of notes and no error (nil).
|
||||||
return notesResponse, nil
|
return notesResponse, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,87 +1,87 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetNote(t *testing.T) {
|
func TestGetNote(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Note]("../../../tests/note.json")
|
response, err := utils.LoadJsonTestData[model.Note]("../../../tests/note.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/notes/1337.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/notes/1337.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
pool, err := GetNote(requestContext, "1337")
|
pool, err := GetNote(requestContext, "1337")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pool.ID == response.ID && pool.Body == response.Body {
|
if pool.ID == response.ID && pool.Body == response.Body {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetNotes(t *testing.T) {
|
func TestGetNotes(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.Note]("../../../tests/notes.json")
|
response, err := utils.LoadJsonTestData[[]model.Note]("../../../tests/notes.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/notes.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/notes.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
pools, err := GetNotes(requestContext, map[string]string{})
|
pools, err := GetNotes(requestContext, map[string]string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pools[0].ID == response[0].ID && pools[1].Body == response[1].Body && pools[2].UpdatedAt == response[2].UpdatedAt {
|
if pools[0].ID == response[0].ID && pools[1].Body == response[1].Body && pools[2].UpdatedAt == response[2].UpdatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,114 +1,114 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetPool retrieves a pool by its ID from the e621 API.
|
// GetPool retrieves a pool by its ID from the e621 API.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - ID: The ID of the pool to retrieve.
|
// - ID: The ID of the pool to retrieve.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - model.Pool: The retrieved pool.
|
// - model.Pool: The retrieved pool.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetPool(requestContext model.RequestContext, ID string) (model.Pool, error) {
|
func GetPool(requestContext model.RequestContext, ID string) (model.Pool, error) {
|
||||||
// Create a new HTTP GET request to fetch the pool information.
|
// Create a new HTTP GET request to fetch the pool information.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/pools/%s.json", requestContext.Host, ID), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/pools/%s.json", requestContext.Host, ID), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Pool struct and the error.
|
// Log the error and return an empty Pool struct and the error.
|
||||||
|
|
||||||
return model.Pool{}, err
|
return model.Pool{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Pool struct and the error.
|
// Log the error and return an empty Pool struct and the error.
|
||||||
|
|
||||||
return model.Pool{}, err
|
return model.Pool{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return model.Pool{}, utils.StatusCodesToError(resp.StatusCode)
|
return model.Pool{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a Pool struct to store the response data.
|
// Initialize a Pool struct to store the response data.
|
||||||
var poolResponse model.Pool
|
var poolResponse model.Pool
|
||||||
|
|
||||||
// Decode the JSON response into the Pool struct.
|
// Decode the JSON response into the Pool struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&poolResponse)
|
err = json.NewDecoder(resp.Body).Decode(&poolResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Pool struct and the error.
|
// Log the error and return an empty Pool struct and the error.
|
||||||
|
|
||||||
return model.Pool{}, err
|
return model.Pool{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the pool information and no error (nil).
|
// Return the pool information and no error (nil).
|
||||||
return poolResponse, nil
|
return poolResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPools retrieves a list of pools from the e621 API based on query parameters.
|
// GetPools retrieves a list of pools from the e621 API based on query parameters.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.Pool: A slice of pools.
|
// - []model.Pool: A slice of pools.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetPools(requestContext model.RequestContext, query map[string]string) ([]model.Pool, error) {
|
func GetPools(requestContext model.RequestContext, query map[string]string) ([]model.Pool, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/pools.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/pools.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a slice of Pool struct to store the response data.
|
// Initialize a slice of Pool struct to store the response data.
|
||||||
var poolsResponse []model.Pool
|
var poolsResponse []model.Pool
|
||||||
|
|
||||||
// Decode the JSON response into the slice of Pool structs.
|
// Decode the JSON response into the slice of Pool structs.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&poolsResponse)
|
err = json.NewDecoder(resp.Body).Decode(&poolsResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty slice and the error.
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the list of pools and no error (nil).
|
// Return the list of pools and no error (nil).
|
||||||
return poolsResponse, nil
|
return poolsResponse, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,87 +1,87 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPool(t *testing.T) {
|
func TestGetPool(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Pool]("../../../tests/pool.json")
|
response, err := utils.LoadJsonTestData[model.Pool]("../../../tests/pool.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/pools/36957.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/pools/36957.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
pool, err := GetPool(requestContext, "36957")
|
pool, err := GetPool(requestContext, "36957")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pool.ID == response.ID && pool.Name == response.Name {
|
if pool.ID == response.ID && pool.Name == response.Name {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pool, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetPools(t *testing.T) {
|
func TestGetPools(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.Pool]("../../../tests/pools.json")
|
response, err := utils.LoadJsonTestData[[]model.Pool]("../../../tests/pools.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/pools.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/pools.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
pools, err := GetPools(requestContext, map[string]string{})
|
pools, err := GetPools(requestContext, map[string]string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pools[0].ID == response[0].ID && pools[1].Name == response[1].Name && pools[2].UpdatedAt == response[2].UpdatedAt {
|
if pools[0].ID == response[0].ID && pools[1].Name == response[1].Name && pools[2].UpdatedAt == response[2].UpdatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", pools, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,113 +1,113 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetPost retrieves a single post by its ID from the e621 API.
|
// GetPost retrieves a single post by its ID from the e621 API.
|
||||||
//
|
//
|
||||||
// Parameters: // - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// Parameters: // - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - ID: The ID of the post to retrieve.
|
// - ID: The ID of the post to retrieve.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - model.Post: The retrieved post.
|
// - model.Post: The retrieved post.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetPost(requestContext model.RequestContext, ID string) (model.Post, error) {
|
func GetPost(requestContext model.RequestContext, ID string) (model.Post, error) {
|
||||||
// Create a new HTTP GET request to fetch the post information.
|
// Create a new HTTP GET request to fetch the post information.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/posts/%s.json", requestContext.Host, ID), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/posts/%s.json", requestContext.Host, ID), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Post struct and the error.
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
return model.Post{}, err
|
return model.Post{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Post struct and the error.
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
return model.Post{}, err
|
return model.Post{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return model.Post{}, utils.StatusCodesToError(resp.StatusCode)
|
return model.Post{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a Post struct to store the response data.
|
// Initialize a Post struct to store the response data.
|
||||||
var postResponse model.PostResponse
|
var postResponse model.PostResponse
|
||||||
|
|
||||||
// Decode the JSON response into the PostResponse struct.
|
// Decode the JSON response into the PostResponse struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Post struct and the error.
|
// Log the error and return an empty Post struct and the error.
|
||||||
|
|
||||||
return model.Post{}, err
|
return model.Post{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the post information and no error (nil).
|
// Return the post information and no error (nil).
|
||||||
return postResponse.Post, nil
|
return postResponse.Post, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPosts retrieves a list of posts from the e621 API based on query parameters.
|
// GetPosts retrieves a list of posts from the e621 API based on query parameters.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.Post: A slice of posts.
|
// - []model.Post: A slice of posts.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetPosts(requestContext model.RequestContext, query map[string]string) ([]model.Post, error) {
|
func GetPosts(requestContext model.RequestContext, query map[string]string) ([]model.Post, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/posts.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/posts.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return nil, utils.StatusCodesToError(resp.StatusCode)
|
return nil, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a slice of Post struct to store the response data.
|
// Initialize a slice of Post struct to store the response data.
|
||||||
var postResponse model.PostResponse
|
var postResponse model.PostResponse
|
||||||
|
|
||||||
// Decode the JSON response into the PostResponse struct.
|
// Decode the JSON response into the PostResponse struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
err = json.NewDecoder(resp.Body).Decode(&postResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty slice and the error.
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the list of posts and no error (nil).
|
// Return the list of posts and no error (nil).
|
||||||
return postResponse.Posts, nil
|
return postResponse.Posts, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,92 +1,92 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetPost(t *testing.T) {
|
func TestGetPost(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
data, err := utils.LoadJsonTestData[model.Post]("../../../tests/post.json")
|
data, err := utils.LoadJsonTestData[model.Post]("../../../tests/post.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
response := model.PostResponse{
|
response := model.PostResponse{
|
||||||
Post: data,
|
Post: data,
|
||||||
Posts: nil,
|
Posts: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/posts/1337.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/posts/1337.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
post, err := GetPost(requestContext, "1337")
|
post, err := GetPost(requestContext, "1337")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if post.ID == response.Post.ID && post.File.URL == response.Post.File.URL {
|
if post.ID == response.Post.ID && post.File.URL == response.Post.File.URL {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", post, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", post, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetPosts(t *testing.T) {
|
func TestGetPosts(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
response, err := utils.LoadJsonTestData[model.PostResponse]("../../../tests/posts.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/posts.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/posts.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
posts, err := GetPosts(requestContext, map[string]string{})
|
posts, err := GetPosts(requestContext, map[string]string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
if posts[0].ID == response.Posts[0].ID && posts[1].File.Md5 == response.Posts[1].File.Md5 && posts[2].File.EXT == response.Posts[2].File.EXT {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", posts, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,125 +1,125 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetTag retrieves a tag by its ID from the e621 API.
|
// GetTag retrieves a tag by its ID from the e621 API.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - ID: The ID of the tag to retrieve.
|
// - ID: The ID of the tag to retrieve.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - model.Tag: The retrieved tag.
|
// - model.Tag: The retrieved tag.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetTag(requestContext model.RequestContext, ID string) (model.Tag, error) {
|
func GetTag(requestContext model.RequestContext, ID string) (model.Tag, error) {
|
||||||
// Create a new HTTP GET request to fetch tag information.
|
// Create a new HTTP GET request to fetch tag information.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/tags/%s.json", requestContext.Host, ID), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/tags/%s.json", requestContext.Host, ID), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Tag struct and the error.
|
// Log the error and return an empty Tag struct and the error.
|
||||||
|
|
||||||
return model.Tag{}, err
|
return model.Tag{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application.json")
|
r.Header.Add("Accept", "application.json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Tag struct and the error.
|
// Log the error and return an empty Tag struct and the error.
|
||||||
|
|
||||||
return model.Tag{}, err
|
return model.Tag{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return model.Tag{}, utils.StatusCodesToError(resp.StatusCode)
|
return model.Tag{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a Tag struct to store the response data.
|
// Initialize a Tag struct to store the response data.
|
||||||
var tag model.Tag
|
var tag model.Tag
|
||||||
|
|
||||||
// Decode the JSON response into the Tag struct.
|
// Decode the JSON response into the Tag struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&tag)
|
err = json.NewDecoder(resp.Body).Decode(&tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty Tag struct and the error.
|
// Log the error and return an empty Tag struct and the error.
|
||||||
|
|
||||||
return model.Tag{}, err
|
return model.Tag{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the tag information and no error (nil).
|
// Return the tag information and no error (nil).
|
||||||
return tag, nil
|
return tag, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTags retrieves a list of tags from the e621 API based on query parameters.
|
// GetTags retrieves a list of tags from the e621 API based on query parameters.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Query:
|
// Query:
|
||||||
// - search[name_matches]: A tag name expression to match against, which can include * as a wildcard.
|
// - search[name_matches]: A tag name expression to match against, which can include * as a wildcard.
|
||||||
// - search[category]: Filters results to a particular category. Default value is blank (show all tags). 0 general; 1 artist; 3 copyright; 4 character; 5 species; 6 invalid; 7 meta; 8 lore
|
// - search[category]: Filters results to a particular category. Default value is blank (show all tags). 0 general; 1 artist; 3 copyright; 4 character; 5 species; 6 invalid; 7 meta; 8 lore
|
||||||
// - search[order]: Changes the sort order. Pass one of date (default), count, or name.
|
// - search[order]: Changes the sort order. Pass one of date (default), count, or name.
|
||||||
// - search[hide_empty]: Hide tags with zero visible posts. Pass true (default) or false.
|
// - search[hide_empty]: Hide tags with zero visible posts. Pass true (default) or false.
|
||||||
// - search[has_wiki]: Show only tags with, or without, a wiki page. Pass true, false, or blank (default).
|
// - search[has_wiki]: Show only tags with, or without, a wiki page. Pass true, false, or blank (default).
|
||||||
// - search[has_artist]: Show only tags with, or without an artist page. Pass true, false, or blank (default).
|
// - search[has_artist]: Show only tags with, or without an artist page. Pass true, false, or blank (default).
|
||||||
// - limit: Maximum number of results to return per query. Default is 75. There is a hard upper limit of 320.
|
// - limit: Maximum number of results to return per query. Default is 75. There is a hard upper limit of 320.
|
||||||
// - page: The page that will be returned. Can also be used with a or b + tag_id to get the tags after or before the specified tag ID. For example a13 gets every tag after tag_id 13 up to the limit. This overrides the specified search ordering, date is always used instead.
|
// - page: The page that will be returned. Can also be used with a or b + tag_id to get the tags after or before the specified tag ID. For example a13 gets every tag after tag_id 13 up to the limit. This overrides the specified search ordering, date is always used instead.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.Tag: A slice of tags.
|
// - []model.Tag: A slice of tags.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetTags(requestContext model.RequestContext, query map[string]string) ([]model.Tag, error) {
|
func GetTags(requestContext model.RequestContext, query map[string]string) ([]model.Tag, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/tags.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/tags.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return []model.Tag{}, utils.StatusCodesToError(resp.StatusCode)
|
return []model.Tag{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a slice of Tag struct to store the response data.
|
// Initialize a slice of Tag struct to store the response data.
|
||||||
var tags []model.Tag
|
var tags []model.Tag
|
||||||
|
|
||||||
// Decode the JSON response into the slice of Tag structs.
|
// Decode the JSON response into the slice of Tag structs.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&tags)
|
err = json.NewDecoder(resp.Body).Decode(&tags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty slice and the error.
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
return []model.Tag{}, err
|
return []model.Tag{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the list of tags and no error (nil).
|
// Return the list of tags and no error (nil).
|
||||||
return tags, nil
|
return tags, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetTag(t *testing.T) {
|
func TestGetTag(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.Tag]("../../../tests/tag.json")
|
response, err := utils.LoadJsonTestData[model.Tag]("../../../tests/tag.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/tags/165165.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/tags/165165.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
tag, err := GetTag(requestContext, "165165")
|
tag, err := GetTag(requestContext, "165165")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if tag.ID == response.ID && tag.Name == response.Name && tag.CreatedAt == response.CreatedAt {
|
if tag.ID == response.ID && tag.Name == response.Name && tag.CreatedAt == response.CreatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", tag, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", tag, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,114 +1,114 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetUser retrieves user information from e621.net based on the provided username.
|
// GetUser retrieves user information from e621.net based on the provided username.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - username: The username of the user to retrieve.
|
// - username: The username of the user to retrieve.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - model.User: The retrieved user.
|
// - model.User: The retrieved user.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetUser(requestContext model.RequestContext, username string) (model.User, error) {
|
func GetUser(requestContext model.RequestContext, username string) (model.User, error) {
|
||||||
// Create a new HTTP GET request to fetch user information from the specified 'host' and 'username'.
|
// Create a new HTTP GET request to fetch user information from the specified 'host' and 'username'.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/users/%s.json", requestContext.Host, username), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/users/%s.json", requestContext.Host, username), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty User struct and the error.
|
// Log the error and return an empty User struct and the error.
|
||||||
|
|
||||||
return model.User{}, err
|
return model.User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty User struct and the error.
|
// Log the error and return an empty User struct and the error.
|
||||||
|
|
||||||
return model.User{}, err
|
return model.User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return model.User{}, utils.StatusCodesToError(resp.StatusCode)
|
return model.User{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a User struct to store the response data.
|
// Initialize a User struct to store the response data.
|
||||||
var user model.User
|
var user model.User
|
||||||
|
|
||||||
// Decode the JSON response into the User struct.
|
// Decode the JSON response into the User struct.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&user)
|
err = json.NewDecoder(resp.Body).Decode(&user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty User struct and the error.
|
// Log the error and return an empty User struct and the error.
|
||||||
|
|
||||||
return model.User{}, err
|
return model.User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the user information and no error (nil).
|
// Return the user information and no error (nil).
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsers retrieves a list of users from e621.net based on query parameters.
|
// GetUsers retrieves a list of users from e621.net based on query parameters.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
// - requestContext: The context for the API request, including the host, user agent, username, and API key.
|
||||||
// - query: A map containing additional query parameters for the API request.
|
// - query: A map containing additional query parameters for the API request.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - []model.User: A slice of users.
|
// - []model.User: A slice of users.
|
||||||
// - error: An error, if any, encountered during the API request or response handling.
|
// - error: An error, if any, encountered during the API request or response handling.
|
||||||
func GetUsers(requestContext model.RequestContext, query map[string]string) ([]model.User, error) {
|
func GetUsers(requestContext model.RequestContext, query map[string]string) ([]model.User, error) {
|
||||||
// Create a new HTTP GET request.
|
// Create a new HTTP GET request.
|
||||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/users.json", requestContext.Host), nil)
|
r, err := http.NewRequest("GET", fmt.Sprintf("%s/users.json", requestContext.Host), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append query parameters to the request URL.
|
// Append query parameters to the request URL.
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
q.Add(k, v)
|
q.Add(k, v)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
|
|
||||||
r.Header.Set("User-Agent", requestContext.UserAgent)
|
r.Header.Set("User-Agent", requestContext.UserAgent)
|
||||||
r.Header.Add("Accept", "application/json")
|
r.Header.Add("Accept", "application/json")
|
||||||
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
r.SetBasicAuth(requestContext.Username, requestContext.APIKey)
|
||||||
|
|
||||||
// Send the request using the provided http.Client.
|
// Send the request using the provided http.Client.
|
||||||
resp, err := requestContext.Client.Do(r)
|
resp, err := requestContext.Client.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the HTTP response status code indicates success (2xx range).
|
// Check if the HTTP response status code indicates success (2xx range).
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
if resp.StatusCode < 200 || resp.StatusCode > 300 {
|
||||||
// If the status code is outside the 2xx range, return an error based on the status code.
|
// If the status code is outside the 2xx range, return an error based on the status code.
|
||||||
return []model.User{}, utils.StatusCodesToError(resp.StatusCode)
|
return []model.User{}, utils.StatusCodesToError(resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize a slice of User struct to store the response data.
|
// Initialize a slice of User struct to store the response data.
|
||||||
var users []model.User
|
var users []model.User
|
||||||
|
|
||||||
// Decode the JSON response into the slice of User structs.
|
// Decode the JSON response into the slice of User structs.
|
||||||
err = json.NewDecoder(resp.Body).Decode(&users)
|
err = json.NewDecoder(resp.Body).Decode(&users)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Log the error and return an empty slice and the error.
|
// Log the error and return an empty slice and the error.
|
||||||
|
|
||||||
return []model.User{}, err
|
return []model.User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the list of users and no error (nil).
|
// Return the list of users and no error (nil).
|
||||||
return users, nil
|
return users, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,87 +1,87 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model"
|
||||||
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
"git.dragse.it/anthrove/e621-sdk-go/pkg/e621/utils"
|
||||||
"github.com/jarcoal/httpmock"
|
"github.com/jarcoal/httpmock"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetUser(t *testing.T) {
|
func TestGetUser(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[model.User]("../../../tests/user.json")
|
response, err := utils.LoadJsonTestData[model.User]("../../../tests/user.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/users/selloo.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/users/selloo.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := GetUser(requestContext, "selloo")
|
user, err := GetUser(requestContext, "selloo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.ID == response.ID && user.Name == response.Name && user.CreatedAt == response.CreatedAt {
|
if user.ID == response.ID && user.Name == response.Name && user.CreatedAt == response.CreatedAt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetUsers(t *testing.T) {
|
func TestGetUsers(t *testing.T) {
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
|
|
||||||
response, err := utils.LoadJsonTestData[[]model.User]("../../../tests/users.json")
|
response, err := utils.LoadJsonTestData[[]model.User]("../../../tests/users.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
responder, err := httpmock.NewJsonResponder(200, response)
|
responder, err := httpmock.NewJsonResponder(200, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
httpmock.RegisterResponder("GET", "https://e621.net/users.json", responder)
|
httpmock.RegisterResponder("GET", "https://e621.net/users.json", responder)
|
||||||
|
|
||||||
requestContext := model.RequestContext{
|
requestContext := model.RequestContext{
|
||||||
Client: http.Client{},
|
Client: http.Client{},
|
||||||
Host: "https://e621.net",
|
Host: "https://e621.net",
|
||||||
UserAgent: "Go-e621-SDK (@username)",
|
UserAgent: "Go-e621-SDK (@username)",
|
||||||
Username: "memo",
|
Username: "memo",
|
||||||
APIKey: "123456",
|
APIKey: "123456",
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := GetUsers(requestContext, map[string]string{})
|
user, err := GetUsers(requestContext, map[string]string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if user[0].ID == response[0].ID && user[1].Name == response[1].Name {
|
if user[0].ID == response[0].ID && user[1].Name == response[1].Name {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, response)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RequestContext struct {
|
type RequestContext struct {
|
||||||
Client http.Client
|
Client http.Client
|
||||||
RateLimiter *rate.Limiter
|
RateLimiter *rate.Limiter
|
||||||
Host string
|
Host string
|
||||||
UserAgent string
|
UserAgent string
|
||||||
Username string
|
Username string
|
||||||
APIKey string
|
APIKey string
|
||||||
}
|
}
|
||||||
|
|
16
pkg/e621/model/dmail.go
Normal file
16
pkg/e621/model/dmail.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type DMail struct {
|
||||||
|
Body string `json:"body"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
FromId int `json:"from_id"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
IsDeleted bool `json:"is_deleted"`
|
||||||
|
IsRead bool `json:"is_read"`
|
||||||
|
OwnerId int `json:"owner_id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
ToId int `json:"to_id"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
}
|
|
@ -1,17 +1,17 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type Note struct {
|
type Note struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
CreatedAt string `json:"created_at"`
|
CreatedAt string `json:"created_at"`
|
||||||
UpdatedAt string `json:"updated_at"`
|
UpdatedAt string `json:"updated_at"`
|
||||||
CreatorID int64 `json:"creator_id"`
|
CreatorID int64 `json:"creator_id"`
|
||||||
X int64 `json:"x"`
|
X int64 `json:"x"`
|
||||||
Y int64 `json:"y"`
|
Y int64 `json:"y"`
|
||||||
Width int64 `json:"width"`
|
Width int64 `json:"width"`
|
||||||
Height int64 `json:"height"`
|
Height int64 `json:"height"`
|
||||||
Version int64 `json:"version"`
|
Version int64 `json:"version"`
|
||||||
IsActive bool `json:"is_active"`
|
IsActive bool `json:"is_active"`
|
||||||
PostID int64 `json:"post_id"`
|
PostID int64 `json:"post_id"`
|
||||||
Body string `json:"body"`
|
Body string `json:"body"`
|
||||||
CreatorName string `json:"creator_name"`
|
CreatorName string `json:"creator_name"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,30 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type PoolCategory string
|
type PoolCategory string
|
||||||
type PoolOrder string
|
type PoolOrder string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Series PoolCategory = "series"
|
Series PoolCategory = "series"
|
||||||
Collection PoolCategory = "collection"
|
Collection PoolCategory = "collection"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
PoolName PoolOrder = "name"
|
PoolName PoolOrder = "name"
|
||||||
CreatedAt PoolOrder = "created_at"
|
CreatedAt PoolOrder = "created_at"
|
||||||
UpdatedAt PoolOrder = "updated_at"
|
UpdatedAt PoolOrder = "updated_at"
|
||||||
PostCount PoolOrder = "post_count"
|
PostCount PoolOrder = "post_count"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Pool struct {
|
type Pool struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
CreatedAt string `json:"created_at"`
|
CreatedAt string `json:"created_at"`
|
||||||
UpdatedAt string `json:"updated_at"`
|
UpdatedAt string `json:"updated_at"`
|
||||||
CreatorID int64 `json:"creator_id"`
|
CreatorID int64 `json:"creator_id"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
IsActive bool `json:"is_active"`
|
IsActive bool `json:"is_active"`
|
||||||
Category PoolCategory `json:"category"`
|
Category PoolCategory `json:"category"`
|
||||||
PostIDS []int64 `json:"post_ids"`
|
PostIDS []int64 `json:"post_ids"`
|
||||||
CreatorName string `json:"creator_name"`
|
CreatorName string `json:"creator_name"`
|
||||||
PostCount int64 `json:"post_count"`
|
PostCount int64 `json:"post_count"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,93 +1,93 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type PostID int64
|
type PostID int64
|
||||||
|
|
||||||
type PostResponse struct {
|
type PostResponse struct {
|
||||||
Post Post `json:"post"`
|
Post Post `json:"post"`
|
||||||
Posts []Post `json:"posts"`
|
Posts []Post `json:"posts"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Post struct {
|
type Post struct {
|
||||||
ID PostID `json:"id"`
|
ID PostID `json:"id"`
|
||||||
CreatedAt string `json:"created_at"`
|
CreatedAt string `json:"created_at"`
|
||||||
UpdatedAt string `json:"updated_at"`
|
UpdatedAt string `json:"updated_at"`
|
||||||
File File `json:"file"`
|
File File `json:"file"`
|
||||||
Preview Preview `json:"preview"`
|
Preview Preview `json:"preview"`
|
||||||
Sample Sample `json:"sample"`
|
Sample Sample `json:"sample"`
|
||||||
Score Score `json:"score"`
|
Score Score `json:"score"`
|
||||||
Tags Tags `json:"tags"`
|
Tags Tags `json:"tags"`
|
||||||
LockedTags []interface{} `json:"locked_tags"`
|
LockedTags []interface{} `json:"locked_tags"`
|
||||||
ChangeSeq int64 `json:"change_seq"`
|
ChangeSeq int64 `json:"change_seq"`
|
||||||
Flags Flags `json:"flags"`
|
Flags Flags `json:"flags"`
|
||||||
Rating string `json:"rating"`
|
Rating string `json:"rating"`
|
||||||
FavCount int64 `json:"fav_count"`
|
FavCount int64 `json:"fav_count"`
|
||||||
Sources []string `json:"sources"`
|
Sources []string `json:"sources"`
|
||||||
Pools []interface{} `json:"pools"`
|
Pools []interface{} `json:"pools"`
|
||||||
Relationships Relationships `json:"relationships"`
|
Relationships Relationships `json:"relationships"`
|
||||||
ApproverID interface{} `json:"approver_id"`
|
ApproverID interface{} `json:"approver_id"`
|
||||||
UploaderID int64 `json:"uploader_id"`
|
UploaderID int64 `json:"uploader_id"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
CommentCount int64 `json:"comment_count"`
|
CommentCount int64 `json:"comment_count"`
|
||||||
IsFavorited bool `json:"is_favorited"`
|
IsFavorited bool `json:"is_favorited"`
|
||||||
HasNotes bool `json:"has_notes"`
|
HasNotes bool `json:"has_notes"`
|
||||||
Duration interface{} `json:"duration"`
|
Duration interface{} `json:"duration"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
Width int64 `json:"width"`
|
Width int64 `json:"width"`
|
||||||
Height int64 `json:"height"`
|
Height int64 `json:"height"`
|
||||||
EXT string `json:"ext"`
|
EXT string `json:"ext"`
|
||||||
Size int64 `json:"size"`
|
Size int64 `json:"size"`
|
||||||
Md5 string `json:"md5"`
|
Md5 string `json:"md5"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Flags struct {
|
type Flags struct {
|
||||||
Pending bool `json:"pending"`
|
Pending bool `json:"pending"`
|
||||||
Flagged bool `json:"flagged"`
|
Flagged bool `json:"flagged"`
|
||||||
NoteLocked bool `json:"note_locked"`
|
NoteLocked bool `json:"note_locked"`
|
||||||
StatusLocked bool `json:"status_locked"`
|
StatusLocked bool `json:"status_locked"`
|
||||||
RatingLocked bool `json:"rating_locked"`
|
RatingLocked bool `json:"rating_locked"`
|
||||||
Deleted bool `json:"deleted"`
|
Deleted bool `json:"deleted"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Preview struct {
|
type Preview struct {
|
||||||
Width int64 `json:"width"`
|
Width int64 `json:"width"`
|
||||||
Height int64 `json:"height"`
|
Height int64 `json:"height"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Relationships struct {
|
type Relationships struct {
|
||||||
ParentID interface{} `json:"parent_id"`
|
ParentID interface{} `json:"parent_id"`
|
||||||
HasChildren bool `json:"has_children"`
|
HasChildren bool `json:"has_children"`
|
||||||
HasActiveChildren bool `json:"has_active_children"`
|
HasActiveChildren bool `json:"has_active_children"`
|
||||||
Children []interface{} `json:"children"`
|
Children []interface{} `json:"children"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Sample struct {
|
type Sample struct {
|
||||||
Has bool `json:"has"`
|
Has bool `json:"has"`
|
||||||
Height int64 `json:"height"`
|
Height int64 `json:"height"`
|
||||||
Width int64 `json:"width"`
|
Width int64 `json:"width"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
Alternates Alternates `json:"alternates"`
|
Alternates Alternates `json:"alternates"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Alternates struct {
|
type Alternates struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Score struct {
|
type Score struct {
|
||||||
Up int64 `json:"up"`
|
Up int64 `json:"up"`
|
||||||
Down int64 `json:"down"`
|
Down int64 `json:"down"`
|
||||||
Total int64 `json:"total"`
|
Total int64 `json:"total"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tags struct {
|
type Tags struct {
|
||||||
General []string `json:"general"`
|
General []string `json:"general"`
|
||||||
Artist []string `json:"artist"`
|
Artist []string `json:"artist"`
|
||||||
Copyright []string `json:"copyright"`
|
Copyright []string `json:"copyright"`
|
||||||
Character []string `json:"character"`
|
Character []string `json:"character"`
|
||||||
Species []string `json:"species"`
|
Species []string `json:"species"`
|
||||||
Invalid []string `json:"invalid"`
|
Invalid []string `json:"invalid"`
|
||||||
Meta []string `json:"meta"`
|
Meta []string `json:"meta"`
|
||||||
Lore []string `json:"lore"`
|
Lore []string `json:"lore"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type TagCategory int
|
type TagCategory int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
General TagCategory = iota
|
General TagCategory = iota
|
||||||
Artist
|
Artist
|
||||||
Copyright TagCategory = iota + 1
|
Copyright TagCategory = iota + 1
|
||||||
Character
|
Character
|
||||||
Species
|
Species
|
||||||
Invalide
|
Invalide
|
||||||
Meta
|
Meta
|
||||||
Lore
|
Lore
|
||||||
)
|
)
|
||||||
|
|
||||||
type Tag struct {
|
type Tag struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
PostCount int64 `json:"post_count"`
|
PostCount int64 `json:"post_count"`
|
||||||
RelatedTags string `json:"related_tags"`
|
RelatedTags string `json:"related_tags"`
|
||||||
RelatedTagsUpdatedAt string `json:"related_tags_updated_at"`
|
RelatedTagsUpdatedAt string `json:"related_tags_updated_at"`
|
||||||
Category TagCategory `json:"category"`
|
Category TagCategory `json:"category"`
|
||||||
IsLocked bool `json:"is_locked"`
|
IsLocked bool `json:"is_locked"`
|
||||||
CreatedAt string `json:"created_at"`
|
CreatedAt string `json:"created_at"`
|
||||||
UpdatedAt string `json:"updated_at"`
|
UpdatedAt string `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,51 +1,51 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type UserID int64
|
type UserID int64
|
||||||
type UserLevel int
|
type UserLevel int
|
||||||
type Order string
|
type Order string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Anonymus UserLevel = 0
|
Anonymus UserLevel = 0
|
||||||
Blocked UserLevel = 10
|
Blocked UserLevel = 10
|
||||||
Member UserLevel = 20
|
Member UserLevel = 20
|
||||||
Privilaged UserLevel = 30
|
Privilaged UserLevel = 30
|
||||||
FormerStaff UserLevel = 34
|
FormerStaff UserLevel = 34
|
||||||
Janitor UserLevel = 35
|
Janitor UserLevel = 35
|
||||||
Moderator UserLevel = 40
|
Moderator UserLevel = 40
|
||||||
Admin UserLevel = 50
|
Admin UserLevel = 50
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
JoinDate Order = "date"
|
JoinDate Order = "date"
|
||||||
UserName Order = "name"
|
UserName Order = "name"
|
||||||
PostUploadCount Order = "post_upload_count"
|
PostUploadCount Order = "post_upload_count"
|
||||||
NoteCount Order = "note_count"
|
NoteCount Order = "note_count"
|
||||||
PostUpdateCount Order = "post_upload_count"
|
PostUpdateCount Order = "post_upload_count"
|
||||||
)
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
WikiPageVersionCount int64 `json:"wiki_page_version_count"`
|
WikiPageVersionCount int64 `json:"wiki_page_version_count"`
|
||||||
ArtistVersionCount int64 `json:"artist_version_count"`
|
ArtistVersionCount int64 `json:"artist_version_count"`
|
||||||
PoolVersionCount int64 `json:"pool_version_count"`
|
PoolVersionCount int64 `json:"pool_version_count"`
|
||||||
ForumPostCount int64 `json:"forum_post_count"`
|
ForumPostCount int64 `json:"forum_post_count"`
|
||||||
CommentCount int64 `json:"comment_count"`
|
CommentCount int64 `json:"comment_count"`
|
||||||
FlagCount int64 `json:"flag_count"`
|
FlagCount int64 `json:"flag_count"`
|
||||||
FavoriteCount int64 `json:"favorite_count"`
|
FavoriteCount int64 `json:"favorite_count"`
|
||||||
PositiveFeedbackCount int64 `json:"positive_feedback_count"`
|
PositiveFeedbackCount int64 `json:"positive_feedback_count"`
|
||||||
NeutralFeedbackCount int64 `json:"neutral_feedback_count"`
|
NeutralFeedbackCount int64 `json:"neutral_feedback_count"`
|
||||||
NegativeFeedbackCount int64 `json:"negative_feedback_count"`
|
NegativeFeedbackCount int64 `json:"negative_feedback_count"`
|
||||||
UploadLimit int64 `json:"upload_limit"`
|
UploadLimit int64 `json:"upload_limit"`
|
||||||
ID UserID `json:"id"`
|
ID UserID `json:"id"`
|
||||||
CreatedAt string `json:"created_at"`
|
CreatedAt string `json:"created_at"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Level UserLevel `json:"level"`
|
Level UserLevel `json:"level"`
|
||||||
BaseUploadLimit int64 `json:"base_upload_limit"`
|
BaseUploadLimit int64 `json:"base_upload_limit"`
|
||||||
PostUploadCount int64 `json:"post_upload_count"`
|
PostUploadCount int64 `json:"post_upload_count"`
|
||||||
PostUpdateCount int64 `json:"post_update_count"`
|
PostUpdateCount int64 `json:"post_update_count"`
|
||||||
NoteUpdateCount int64 `json:"note_update_count"`
|
NoteUpdateCount int64 `json:"note_update_count"`
|
||||||
IsBanned bool `json:"is_banned"`
|
IsBanned bool `json:"is_banned"`
|
||||||
CanApprovePosts bool `json:"can_approve_posts"`
|
CanApprovePosts bool `json:"can_approve_posts"`
|
||||||
CanUploadFree bool `json:"can_upload_free"`
|
CanUploadFree bool `json:"can_upload_free"`
|
||||||
LevelString string `json:"level_string"`
|
LevelString string `json:"level_string"`
|
||||||
AvatarID PostID `json:"avatar_id"`
|
AvatarID PostID `json:"avatar_id"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
// E621_MAX_POST_COUNT is the maximum allowable post count for E621.
|
// E621_MAX_POST_COUNT is the maximum allowable post count for E621.
|
||||||
const E621_MAX_POST_COUNT = 320
|
const E621_MAX_POST_COUNT = 320
|
||||||
|
|
|
@ -1,106 +1,106 @@
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
// StatusCodesToError maps HTTP status codes to corresponding error types.
|
// StatusCodesToError maps HTTP status codes to corresponding error types.
|
||||||
func StatusCodesToError(statusCode int) error {
|
func StatusCodesToError(statusCode int) error {
|
||||||
var err error
|
var err error
|
||||||
switch statusCode {
|
switch statusCode {
|
||||||
case 403:
|
case 403:
|
||||||
err = AccessDeniedError{}
|
err = AccessDeniedError{}
|
||||||
case 404:
|
case 404:
|
||||||
err = NotFoundError{}
|
err = NotFoundError{}
|
||||||
case 412:
|
case 412:
|
||||||
err = PreconditionFailedError{}
|
err = PreconditionFailedError{}
|
||||||
case 421:
|
case 421:
|
||||||
err = RateLimitReachedError{}
|
err = RateLimitReachedError{}
|
||||||
case 424:
|
case 424:
|
||||||
err = InvalidParametersError{}
|
err = InvalidParametersError{}
|
||||||
case 500:
|
case 500:
|
||||||
err = InternalServerError{}
|
err = InternalServerError{}
|
||||||
case 502:
|
case 502:
|
||||||
err = BadGatewayError{}
|
err = BadGatewayError{}
|
||||||
case 503:
|
case 503:
|
||||||
err = ServiceUnavailableError{}
|
err = ServiceUnavailableError{}
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("unhandled status code: %d", statusCode)
|
err = fmt.Errorf("unhandled status code: %d", statusCode)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccessDeniedError represents an "Access Denied" error.
|
// AccessDeniedError represents an "Access Denied" error.
|
||||||
type AccessDeniedError struct{}
|
type AccessDeniedError struct{}
|
||||||
|
|
||||||
func (_ AccessDeniedError) Error() string {
|
func (_ AccessDeniedError) Error() string {
|
||||||
return "access denied"
|
return "access denied"
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotFoundError represents a "Not Found" error.
|
// NotFoundError represents a "Not Found" error.
|
||||||
type NotFoundError struct{}
|
type NotFoundError struct{}
|
||||||
|
|
||||||
func (_ NotFoundError) Error() string {
|
func (_ NotFoundError) Error() string {
|
||||||
return "not found"
|
return "not found"
|
||||||
}
|
}
|
||||||
|
|
||||||
// PreconditionFailedError represents a "Precondition Failed" error.
|
// PreconditionFailedError represents a "Precondition Failed" error.
|
||||||
type PreconditionFailedError struct{}
|
type PreconditionFailedError struct{}
|
||||||
|
|
||||||
func (_ PreconditionFailedError) Error() string {
|
func (_ PreconditionFailedError) Error() string {
|
||||||
return "precondition failed"
|
return "precondition failed"
|
||||||
}
|
}
|
||||||
|
|
||||||
// RateLimitReachedError represents a "Rate Limit Reached" error.
|
// RateLimitReachedError represents a "Rate Limit Reached" error.
|
||||||
type RateLimitReachedError struct{}
|
type RateLimitReachedError struct{}
|
||||||
|
|
||||||
func (_ RateLimitReachedError) Error() string {
|
func (_ RateLimitReachedError) Error() string {
|
||||||
return "rate limit reached"
|
return "rate limit reached"
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvalidParametersError represents an "Invalid Parameters" error.
|
// InvalidParametersError represents an "Invalid Parameters" error.
|
||||||
type InvalidParametersError struct{}
|
type InvalidParametersError struct{}
|
||||||
|
|
||||||
func (_ InvalidParametersError) Error() string {
|
func (_ InvalidParametersError) Error() string {
|
||||||
return "invalid parameters"
|
return "invalid parameters"
|
||||||
}
|
}
|
||||||
|
|
||||||
// InternalServerError represents an "Internal Server Error" error.
|
// InternalServerError represents an "Internal Server Error" error.
|
||||||
type InternalServerError struct{}
|
type InternalServerError struct{}
|
||||||
|
|
||||||
func (_ InternalServerError) Error() string {
|
func (_ InternalServerError) Error() string {
|
||||||
return "internal server error"
|
return "internal server error"
|
||||||
}
|
}
|
||||||
|
|
||||||
// BadGatewayError represents a "Bad Gateway" error.
|
// BadGatewayError represents a "Bad Gateway" error.
|
||||||
type BadGatewayError struct{}
|
type BadGatewayError struct{}
|
||||||
|
|
||||||
func (_ BadGatewayError) Error() string {
|
func (_ BadGatewayError) Error() string {
|
||||||
return "bad gateway"
|
return "bad gateway"
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServiceUnavailableError represents a "Service Unavailable" error.
|
// ServiceUnavailableError represents a "Service Unavailable" error.
|
||||||
type ServiceUnavailableError struct{}
|
type ServiceUnavailableError struct{}
|
||||||
|
|
||||||
func (_ ServiceUnavailableError) Error() string {
|
func (_ ServiceUnavailableError) Error() string {
|
||||||
return "service unavailable"
|
return "service unavailable"
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnknownError represents an "Unknown" error.
|
// UnknownError represents an "Unknown" error.
|
||||||
type UnknownError struct{}
|
type UnknownError struct{}
|
||||||
|
|
||||||
func (_ UnknownError) Error() string {
|
func (_ UnknownError) Error() string {
|
||||||
return "unknown error"
|
return "unknown error"
|
||||||
}
|
}
|
||||||
|
|
||||||
// OriginConnectionTimeOutError represents an "Origin Connection Time-Out" error.
|
// OriginConnectionTimeOutError represents an "Origin Connection Time-Out" error.
|
||||||
type OriginConnectionTimeOutError struct{}
|
type OriginConnectionTimeOutError struct{}
|
||||||
|
|
||||||
func (_ OriginConnectionTimeOutError) Error() string {
|
func (_ OriginConnectionTimeOutError) Error() string {
|
||||||
return "origin connection time-out"
|
return "origin connection time-out"
|
||||||
}
|
}
|
||||||
|
|
||||||
// SSLHandshakeFailedError represents an "SSL Handshake Failed" error.
|
// SSLHandshakeFailedError represents an "SSL Handshake Failed" error.
|
||||||
type SSLHandshakeFailedError struct{}
|
type SSLHandshakeFailedError struct{}
|
||||||
|
|
||||||
func (_ SSLHandshakeFailedError) Error() string {
|
func (_ SSLHandshakeFailedError) Error() string {
|
||||||
return "ssl handshake failed"
|
return "ssl handshake failed"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func LoadJsonTestData[T any](testDataPath string) (T, error) {
|
func LoadJsonTestData[T any](testDataPath string) (T, error) {
|
||||||
// Create a variable to store the decoded JSON data
|
// Create a variable to store the decoded JSON data
|
||||||
var jsonData T
|
var jsonData T
|
||||||
|
|
||||||
// Open the JSON file
|
// Open the JSON file
|
||||||
file, err := os.Open(testDataPath)
|
file, err := os.Open(testDataPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return jsonData, err
|
return jsonData, err
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
// Create a decoder
|
// Create a decoder
|
||||||
decoder := json.NewDecoder(file)
|
decoder := json.NewDecoder(file)
|
||||||
|
|
||||||
// Decode the JSON data into the struct
|
// Decode the JSON data into the struct
|
||||||
if err := decoder.Decode(&jsonData); err != nil {
|
if err := decoder.Decode(&jsonData); err != nil {
|
||||||
return jsonData, err
|
return jsonData, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonData, nil
|
return jsonData, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
{
|
{
|
||||||
"id": 1337,
|
"id": 1337,
|
||||||
"created_at": "2009-05-19T13:30:28.360-04:00",
|
"created_at": "2009-05-19T13:30:28.360-04:00",
|
||||||
"updated_at": "2009-06-02T16:52:06.418-04:00",
|
"updated_at": "2009-06-02T16:52:06.418-04:00",
|
||||||
"creator_id": 2942,
|
"creator_id": 2942,
|
||||||
"x": 163,
|
"x": 163,
|
||||||
"y": 718,
|
"y": 718,
|
||||||
"width": 99,
|
"width": 99,
|
||||||
"height": 47,
|
"height": 47,
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"is_active": false,
|
"is_active": false,
|
||||||
"post_id": 31570,
|
"post_id": 31570,
|
||||||
"body": "BORANGE MORE LIKE IT",
|
"body": "BORANGE MORE LIKE IT",
|
||||||
"creator_name": "DahWuffie"
|
"creator_name": "DahWuffie"
|
||||||
}
|
}
|
2252
tests/notes.json
2252
tests/notes.json
File diff suppressed because it is too large
Load Diff
|
@ -1,38 +1,38 @@
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"name": "Furry_Boys_by_Trump/Team_Shuffle",
|
"name": "Furry_Boys_by_Trump/Team_Shuffle",
|
||||||
"created_at": "2008-10-30T03:42:29.962-04:00",
|
"created_at": "2008-10-30T03:42:29.962-04:00",
|
||||||
"updated_at": "2023-10-24T06:58:59.488-04:00",
|
"updated_at": "2023-10-24T06:58:59.488-04:00",
|
||||||
"creator_id": 7,
|
"creator_id": 7,
|
||||||
"description": "Furry Boys Comic",
|
"description": "Furry Boys Comic",
|
||||||
"is_active": false,
|
"is_active": false,
|
||||||
"category": "series",
|
"category": "series",
|
||||||
"post_ids": [
|
"post_ids": [
|
||||||
3294,
|
3294,
|
||||||
3295,
|
3295,
|
||||||
3296,
|
3296,
|
||||||
3297,
|
3297,
|
||||||
3298,
|
3298,
|
||||||
3299,
|
3299,
|
||||||
3300,
|
3300,
|
||||||
3303,
|
3303,
|
||||||
3306,
|
3306,
|
||||||
3304,
|
3304,
|
||||||
3305,
|
3305,
|
||||||
3307,
|
3307,
|
||||||
3309,
|
3309,
|
||||||
3308,
|
3308,
|
||||||
3313,
|
3313,
|
||||||
3312,
|
3312,
|
||||||
3316,
|
3316,
|
||||||
3314,
|
3314,
|
||||||
3315,
|
3315,
|
||||||
3321,
|
3321,
|
||||||
3317,
|
3317,
|
||||||
3319,
|
3319,
|
||||||
3318,
|
3318,
|
||||||
3320
|
3320
|
||||||
],
|
],
|
||||||
"creator_name": "user_7",
|
"creator_name": "user_7",
|
||||||
"post_count": 24
|
"post_count": 24
|
||||||
}
|
}
|
8002
tests/pools.json
8002
tests/pools.json
File diff suppressed because it is too large
Load Diff
220
tests/post.json
220
tests/post.json
|
@ -1,111 +1,111 @@
|
||||||
{
|
{
|
||||||
"post": {
|
"post": {
|
||||||
"id": 1337,
|
"id": 1337,
|
||||||
"created_at": "2007-02-23T22:14:42.048-05:00",
|
"created_at": "2007-02-23T22:14:42.048-05:00",
|
||||||
"updated_at": "2023-10-20T01:59:09.423-04:00",
|
"updated_at": "2023-10-20T01:59:09.423-04:00",
|
||||||
"file": {
|
"file": {
|
||||||
"width": 790,
|
"width": 790,
|
||||||
"height": 748,
|
"height": 748,
|
||||||
"ext": "jpg",
|
"ext": "jpg",
|
||||||
"size": 156917,
|
"size": 156917,
|
||||||
"md5": "4e7586f0666a7c735b2f9e1ccd18bc68",
|
"md5": "4e7586f0666a7c735b2f9e1ccd18bc68",
|
||||||
"url": "https://static1.e621.net/data/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg"
|
"url": "https://static1.e621.net/data/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg"
|
||||||
},
|
},
|
||||||
"preview": {
|
"preview": {
|
||||||
"width": 150,
|
"width": 150,
|
||||||
"height": 142,
|
"height": 142,
|
||||||
"url": "https://static1.e621.net/data/preview/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg"
|
"url": "https://static1.e621.net/data/preview/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg"
|
||||||
},
|
},
|
||||||
"sample": {
|
"sample": {
|
||||||
"has": false,
|
"has": false,
|
||||||
"height": 748,
|
"height": 748,
|
||||||
"width": 790,
|
"width": 790,
|
||||||
"url": "https://static1.e621.net/data/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg",
|
"url": "https://static1.e621.net/data/4e/75/4e7586f0666a7c735b2f9e1ccd18bc68.jpg",
|
||||||
"alternates": {}
|
"alternates": {}
|
||||||
},
|
},
|
||||||
"score": {
|
"score": {
|
||||||
"up": 46,
|
"up": 46,
|
||||||
"down": -4,
|
"down": -4,
|
||||||
"total": 42
|
"total": 42
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"general": [
|
"general": [
|
||||||
"\u003c3",
|
"\u003c3",
|
||||||
"anthro",
|
"anthro",
|
||||||
"blush",
|
"blush",
|
||||||
"bottomwear",
|
"bottomwear",
|
||||||
"briefs",
|
"briefs",
|
||||||
"chibi",
|
"chibi",
|
||||||
"clothed",
|
"clothed",
|
||||||
"clothing",
|
"clothing",
|
||||||
"dialogue",
|
"dialogue",
|
||||||
"ear_piercing",
|
"ear_piercing",
|
||||||
"footwear",
|
"footwear",
|
||||||
"funny_post_number",
|
"funny_post_number",
|
||||||
"fur",
|
"fur",
|
||||||
"group",
|
"group",
|
||||||
"hair",
|
"hair",
|
||||||
"humor",
|
"humor",
|
||||||
"legwear",
|
"legwear",
|
||||||
"male",
|
"male",
|
||||||
"pants",
|
"pants",
|
||||||
"piercing",
|
"piercing",
|
||||||
"pink_hair",
|
"pink_hair",
|
||||||
"reluctant",
|
"reluctant",
|
||||||
"shirt",
|
"shirt",
|
||||||
"simple_background",
|
"simple_background",
|
||||||
"socks",
|
"socks",
|
||||||
"text",
|
"text",
|
||||||
"topless",
|
"topless",
|
||||||
"topwear",
|
"topwear",
|
||||||
"underwear"
|
"underwear"
|
||||||
],
|
],
|
||||||
"artist": [
|
"artist": [
|
||||||
"sneakerfox"
|
"sneakerfox"
|
||||||
],
|
],
|
||||||
"copyright": [],
|
"copyright": [],
|
||||||
"character": [],
|
"character": [],
|
||||||
"species": [
|
"species": [
|
||||||
"canid",
|
"canid",
|
||||||
"canine",
|
"canine",
|
||||||
"fox",
|
"fox",
|
||||||
"mammal",
|
"mammal",
|
||||||
"mephitid",
|
"mephitid",
|
||||||
"skunk"
|
"skunk"
|
||||||
],
|
],
|
||||||
"invalid": [],
|
"invalid": [],
|
||||||
"meta": [
|
"meta": [
|
||||||
"2003",
|
"2003",
|
||||||
"english_text"
|
"english_text"
|
||||||
],
|
],
|
||||||
"lore": []
|
"lore": []
|
||||||
},
|
},
|
||||||
"locked_tags": [],
|
"locked_tags": [],
|
||||||
"change_seq": 42512291,
|
"change_seq": 42512291,
|
||||||
"flags": {
|
"flags": {
|
||||||
"pending": false,
|
"pending": false,
|
||||||
"flagged": false,
|
"flagged": false,
|
||||||
"note_locked": false,
|
"note_locked": false,
|
||||||
"status_locked": false,
|
"status_locked": false,
|
||||||
"rating_locked": false,
|
"rating_locked": false,
|
||||||
"deleted": false
|
"deleted": false
|
||||||
},
|
},
|
||||||
"rating": "s",
|
"rating": "s",
|
||||||
"fav_count": 84,
|
"fav_count": 84,
|
||||||
"sources": [],
|
"sources": [],
|
||||||
"pools": [],
|
"pools": [],
|
||||||
"relationships": {
|
"relationships": {
|
||||||
"parent_id": null,
|
"parent_id": null,
|
||||||
"has_children": false,
|
"has_children": false,
|
||||||
"has_active_children": false,
|
"has_active_children": false,
|
||||||
"children": []
|
"children": []
|
||||||
},
|
},
|
||||||
"approver_id": null,
|
"approver_id": null,
|
||||||
"uploader_id": 17633,
|
"uploader_id": 17633,
|
||||||
"description": "",
|
"description": "",
|
||||||
"comment_count": 6,
|
"comment_count": 6,
|
||||||
"is_favorited": false,
|
"is_favorited": false,
|
||||||
"has_notes": false,
|
"has_notes": false,
|
||||||
"duration": null
|
"duration": null
|
||||||
}
|
}
|
||||||
}
|
}
|
17638
tests/posts.json
17638
tests/posts.json
File diff suppressed because it is too large
Load Diff
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"id": 1337,
|
"id": 1337,
|
||||||
"name": "clothed",
|
"name": "clothed",
|
||||||
"post_count": 945399,
|
"post_count": 945399,
|
||||||
"related_tags": "clothed 300 clothing 300 mammal 255 anthro 242 female 200 hi_res 197 solo 154 breasts 153 hair 152 male 140 fur 121 duo 102 genitals 101 digital_media_(artwork) 97 canid 88 topwear 88 bodily_fluids 87 text 86 canine 84 simple_background 82 big_breasts 79 smile 79 open_mouth 76 tail 76 felid 75",
|
"related_tags": "clothed 300 clothing 300 mammal 255 anthro 242 female 200 hi_res 197 solo 154 breasts 153 hair 152 male 140 fur 121 duo 102 genitals 101 digital_media_(artwork) 97 canid 88 topwear 88 bodily_fluids 87 text 86 canine 84 simple_background 82 big_breasts 79 smile 79 open_mouth 76 tail 76 felid 75",
|
||||||
"related_tags_updated_at": "2023-10-04T15:01:19.597-04:00",
|
"related_tags_updated_at": "2023-10-04T15:01:19.597-04:00",
|
||||||
"category": 0,
|
"category": 0,
|
||||||
"is_locked": false,
|
"is_locked": false,
|
||||||
"created_at": "2020-03-05T05:49:37.994-05:00",
|
"created_at": "2020-03-05T05:49:37.994-05:00",
|
||||||
"updated_at": "2023-10-04T15:01:19.598-04:00"
|
"updated_at": "2023-10-04T15:01:19.598-04:00"
|
||||||
}
|
}
|
1652
tests/tags.json
1652
tests/tags.json
File diff suppressed because it is too large
Load Diff
|
@ -1,26 +1,26 @@
|
||||||
{
|
{
|
||||||
"wiki_page_version_count": 0,
|
"wiki_page_version_count": 0,
|
||||||
"artist_version_count": 0,
|
"artist_version_count": 0,
|
||||||
"pool_version_count": 0,
|
"pool_version_count": 0,
|
||||||
"forum_post_count": 0,
|
"forum_post_count": 0,
|
||||||
"comment_count": 1,
|
"comment_count": 1,
|
||||||
"flag_count": 0,
|
"flag_count": 0,
|
||||||
"favorite_count": 1454,
|
"favorite_count": 1454,
|
||||||
"positive_feedback_count": 0,
|
"positive_feedback_count": 0,
|
||||||
"neutral_feedback_count": 0,
|
"neutral_feedback_count": 0,
|
||||||
"negative_feedback_count": 0,
|
"negative_feedback_count": 0,
|
||||||
"upload_limit": 10,
|
"upload_limit": 10,
|
||||||
"id": 136501,
|
"id": 136501,
|
||||||
"created_at": "2014-04-23T07:08:04.080-04:00",
|
"created_at": "2014-04-23T07:08:04.080-04:00",
|
||||||
"name": "Selloo",
|
"name": "Selloo",
|
||||||
"level": 20,
|
"level": 20,
|
||||||
"base_upload_limit": 10,
|
"base_upload_limit": 10,
|
||||||
"post_upload_count": 0,
|
"post_upload_count": 0,
|
||||||
"post_update_count": 5,
|
"post_update_count": 5,
|
||||||
"note_update_count": 0,
|
"note_update_count": 0,
|
||||||
"is_banned": false,
|
"is_banned": false,
|
||||||
"can_approve_posts": false,
|
"can_approve_posts": false,
|
||||||
"can_upload_free": false,
|
"can_upload_free": false,
|
||||||
"level_string": "Member",
|
"level_string": "Member",
|
||||||
"avatar_id": 922595
|
"avatar_id": 922595
|
||||||
}
|
}
|
2252
tests/users.json
2252
tests/users.json
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user