Added DMail support #5

Merged
fenpaws merged 11 commits from develop/dm into main 2024-07-11 11:58:03 +00:00
79 changed files with 20651 additions and 20210 deletions

2
.gitignore vendored
View File

@ -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
View File

@ -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: | |

View File

@ -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)
} }
} }

View File

@ -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))
} }

View File

@ -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
View 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("----------")
}

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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
View 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("----------")
}

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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("----------")
} }

View File

@ -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
View File

@ -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
View File

@ -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=

View File

@ -1,4 +1,4 @@
package main package main
func main() { func main() {
} }

79
pkg/e621/builder/dmail.go Normal file
View 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
}

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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 &note, nil return &note, nil
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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)
} }

View File

@ -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
View 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
}

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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(&noteResponse) err = json.NewDecoder(resp.Body).Decode(&noteResponse)
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, &notesResponse) err = json.Unmarshal(respBodyBytes, &notesResponse)
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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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)
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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

View File

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

View File

@ -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
} }

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -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
} }

File diff suppressed because it is too large Load Diff

View File

@ -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
} }
} }

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -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
} }

File diff suppressed because it is too large Load Diff