initial commit
This commit is contained in:
commit
3da230bf58
16
.editorconfig
Normal file
16
.editorconfig
Normal file
@ -0,0 +1,16 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = crlf
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = false
|
||||
max_line_length = 120
|
||||
tab_width = 4
|
||||
|
||||
[{*.go,*.go2}]
|
||||
indent_style = tab
|
||||
|
||||
[{*.yaml,*.yml}]
|
||||
indent_size = 2
|
189
.gitignore
vendored
Normal file
189
.gitignore
vendored
Normal file
@ -0,0 +1,189 @@
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,goland+all,macos,go
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,goland+all,macos,go
|
||||
|
||||
### Go ###
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
### GoLand+all ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# AWS User-specific
|
||||
.idea/**/aws.xml
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# SonarLint plugin
|
||||
.idea/sonarlint/
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### GoLand+all Patch ###
|
||||
# Ignore everything but code style settings and run configurations
|
||||
# that are supposed to be shared within teams.
|
||||
|
||||
.idea/*
|
||||
|
||||
!.idea/codeStyles
|
||||
!.idea/runConfigurations
|
||||
|
||||
### Linux ###
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
### macOS ###
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### macOS Patch ###
|
||||
# iCloud generated files
|
||||
*.icloud
|
||||
|
||||
### Windows ###
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/windows,linux,goland+all,macos,go
|
43
README.md
Normal file
43
README.md
Normal file
@ -0,0 +1,43 @@
|
||||
# Go-e621 SDK
|
||||
|
||||
An unofficial e621 SDK (Client) library to interact with **e621**, **e923** and **e6ai**. Maintained by the Anthrove Development Team.
|
||||
|
||||
# Completeness
|
||||
|
||||
_Legend_
|
||||
|
||||
| Symbol | Meaning |
|
||||
|:------------------:|:----------------------|
|
||||
| :x: | Not implemented |
|
||||
| :heavy_minus_sign: | Partially implemented |
|
||||
| :heavy_check_mark: | Fully implemented |
|
||||
|
||||
_High Level API_
|
||||
|
||||
| Area | Complete | Comment |
|
||||
|:-----------------|:--------:|:--------|
|
||||
| Authentication | :x: | |
|
||||
| Posts | :x: | |
|
||||
| Tags | :x: | |
|
||||
| Tag aliases | :x: | |
|
||||
| Tag implications | :x: | |
|
||||
| Notes | :x: | |
|
||||
| Pools | :x: | |
|
||||
| Users | :x: | |
|
||||
| Favorites | :x: | |
|
||||
| DB export | :x: | |
|
||||
|
||||
_Low Level API_
|
||||
|
||||
| Area | Complete | Comment |
|
||||
|:-----------------|:------------------:|:--------|
|
||||
| Authentication | :x: | |
|
||||
| Posts | :x: | |
|
||||
| Tags | :x: | |
|
||||
| Tag aliases | :x: | |
|
||||
| Tag implications | :x: | |
|
||||
| Notes | :x: | |
|
||||
| Pools | :x: | |
|
||||
| Users | :heavy_check_mark: | |
|
||||
| Favorites | :x: | |
|
||||
| DB export | :x: | |
|
39
example/lowlevel/user.go
Normal file
39
example/lowlevel/user.go
Normal file
@ -0,0 +1,39 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"git.dragse.it/anthrove/e621-to-graph/pkg/e621/endpoints"
|
||||
"git.dragse.it/anthrove/e621-to-graph/pkg/e621/model"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func main() {
|
||||
requestContext := model.RequestContext{
|
||||
Host: "https://e621.net",
|
||||
UserAgent: "Go-e621-SDK (@username)",
|
||||
Username: "",
|
||||
APIKey: "",
|
||||
}
|
||||
|
||||
log.Println("Getting single user: ")
|
||||
client := http.Client{}
|
||||
user, err := endpoints.GetUser(client, requestContext, "selloo")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
log.Println(user.ID)
|
||||
log.Println("----------")
|
||||
|
||||
log.Println("Getting list of users: ")
|
||||
query := map[string]string{
|
||||
"limit": "5",
|
||||
}
|
||||
|
||||
userList, err := endpoints.GetUsers(client, requestContext, query)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
log.Println(len(userList))
|
||||
log.Println("----------")
|
||||
|
||||
}
|
8
go.mod
Normal file
8
go.mod
Normal file
@ -0,0 +1,8 @@
|
||||
module git.dragse.it/anthrove/e621-to-graph
|
||||
|
||||
go 1.21.3
|
||||
|
||||
require (
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/jarcoal/httpmock v1.3.1 // indirect
|
||||
)
|
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
|
||||
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
|
1
internal/client.go
Normal file
1
internal/client.go
Normal file
@ -0,0 +1 @@
|
||||
package internal
|
105
internal/utils/error.go
Normal file
105
internal/utils/error.go
Normal file
@ -0,0 +1,105 @@
|
||||
package utils
|
||||
|
||||
import "fmt"
|
||||
|
||||
func StatusCodesToError(statusCode int) error {
|
||||
var err error
|
||||
switch statusCode {
|
||||
case 403:
|
||||
err = AccessDeniedError{}
|
||||
case 404:
|
||||
err = NotFoundError{}
|
||||
case 412:
|
||||
err = PreconditionFailedError{}
|
||||
case 421:
|
||||
err = RateLimitReachedError{}
|
||||
case 424:
|
||||
err = InvalidParametersError{}
|
||||
case 500:
|
||||
err = InternalServerError{}
|
||||
case 502:
|
||||
err = BadGatewayError{}
|
||||
case 503:
|
||||
err = ServiceUnavailableError{}
|
||||
default:
|
||||
err = fmt.Errorf("unhandels status code: %d", statusCode)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
type AccessDeniedError struct {
|
||||
}
|
||||
|
||||
func (_ AccessDeniedError) Error() string {
|
||||
return "access denied"
|
||||
}
|
||||
|
||||
type NotFoundError struct {
|
||||
}
|
||||
|
||||
func (_ NotFoundError) Error() string {
|
||||
return "not found"
|
||||
}
|
||||
|
||||
type PreconditionFailedError struct {
|
||||
}
|
||||
|
||||
func (_ PreconditionFailedError) Error() string {
|
||||
return "precondition failed"
|
||||
}
|
||||
|
||||
type RateLimitReachedError struct {
|
||||
}
|
||||
|
||||
func (_ RateLimitReachedError) Error() string {
|
||||
return "rate limit reached"
|
||||
}
|
||||
|
||||
type InvalidParametersError struct {
|
||||
}
|
||||
|
||||
func (_ InvalidParametersError) Error() string {
|
||||
return "invalide parameters"
|
||||
}
|
||||
|
||||
type InternalServerError struct {
|
||||
}
|
||||
|
||||
func (_ InternalServerError) Error() string {
|
||||
return "internal server error"
|
||||
}
|
||||
|
||||
type BadGatewayError struct {
|
||||
}
|
||||
|
||||
func (_ BadGatewayError) Error() string {
|
||||
return "bad gateway"
|
||||
}
|
||||
|
||||
type ServiceUnavailableError struct {
|
||||
}
|
||||
|
||||
func (_ ServiceUnavailableError) Error() string {
|
||||
return "service unavailable"
|
||||
}
|
||||
|
||||
type UnknownError struct {
|
||||
}
|
||||
|
||||
func (_ UnknownError) Error() string {
|
||||
return "unknown error"
|
||||
}
|
||||
|
||||
type OriginConnectionTimeOutError struct {
|
||||
}
|
||||
|
||||
func (_ OriginConnectionTimeOutError) Error() string {
|
||||
return "origin connection time-out"
|
||||
}
|
||||
|
||||
type SSLHandshakeFailedError struct {
|
||||
}
|
||||
|
||||
func (_ SSLHandshakeFailedError) Error() string {
|
||||
return "ssl handshake failed"
|
||||
}
|
1
pkg/e621/endpoints/favorites.go
Normal file
1
pkg/e621/endpoints/favorites.go
Normal file
@ -0,0 +1 @@
|
||||
package endpoints
|
1
pkg/e621/endpoints/notes.go
Normal file
1
pkg/e621/endpoints/notes.go
Normal file
@ -0,0 +1 @@
|
||||
package endpoints
|
1
pkg/e621/endpoints/pools.go
Normal file
1
pkg/e621/endpoints/pools.go
Normal file
@ -0,0 +1 @@
|
||||
package endpoints
|
4
pkg/e621/endpoints/post.go
Normal file
4
pkg/e621/endpoints/post.go
Normal file
@ -0,0 +1,4 @@
|
||||
package endpoints
|
||||
|
||||
// Get all users (); endpint to use is e621.net/users.json
|
||||
// Get specific user
|
1
pkg/e621/endpoints/tags.go
Normal file
1
pkg/e621/endpoints/tags.go
Normal file
@ -0,0 +1 @@
|
||||
package endpoints
|
103
pkg/e621/endpoints/user.go
Normal file
103
pkg/e621/endpoints/user.go
Normal file
@ -0,0 +1,103 @@
|
||||
package endpoints
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/e621-to-graph/internal/utils"
|
||||
"git.dragse.it/anthrove/e621-to-graph/pkg/e621/model"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// GetUser sends an HTTP GET request to fetch user information from e621.net.
|
||||
// It constructs a URL based on the provided 'host' and 'username'.
|
||||
// The response is returned as a *http.Response pointer.
|
||||
func GetUser(client http.Client, requestContext model.RequestContext, username string) (model.User, error) {
|
||||
// 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)
|
||||
if err != nil {
|
||||
// Log the error and return an empty User struct and the error.
|
||||
log.Println(err)
|
||||
return model.User{}, 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 := client.Do(r)
|
||||
if err != nil {
|
||||
// Log the error and return an empty User struct and the error.
|
||||
log.Println(err)
|
||||
return model.User{}, 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.User{}, utils.StatusCodesToError(resp.StatusCode)
|
||||
}
|
||||
|
||||
// Initialize a User struct to store the response data.
|
||||
var user model.User
|
||||
|
||||
// Decode the JSON response into the user struct.
|
||||
err = json.NewDecoder(resp.Body).Decode(&user)
|
||||
if err != nil {
|
||||
// Log the error and return an empty User struct and the error.
|
||||
log.Println(err)
|
||||
return model.User{}, err
|
||||
}
|
||||
|
||||
// Return the user information and no error (nil).
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// GetUsers sends an HTTP GET request to fetch user data from e621.net.
|
||||
// It constructs a URL based on the provided 'host' and 'query' parameters.
|
||||
// The response is returned as a *http.Response pointer.
|
||||
func GetUsers(client http.Client, requestContext model.RequestContext, query map[string]string) ([]model.User, error) {
|
||||
// Create a new HTTP GET request.
|
||||
r, err := http.NewRequest("GET", fmt.Sprintf("%s/users.json", requestContext.Host), nil)
|
||||
if err != nil {
|
||||
log.Print(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 := client.Do(r)
|
||||
if err != nil {
|
||||
log.Print(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.User{}, utils.StatusCodesToError(resp.StatusCode)
|
||||
}
|
||||
|
||||
// Initialize a User struct to store the response data.
|
||||
var user []model.User
|
||||
|
||||
// Decode the JSON response into the user struct.
|
||||
err = json.NewDecoder(resp.Body).Decode(&user)
|
||||
if err != nil {
|
||||
// Log the error and return an empty User struct and the error.
|
||||
log.Println(err)
|
||||
return []model.User{}, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
|
||||
}
|
157
pkg/e621/endpoints/user_test.go
Normal file
157
pkg/e621/endpoints/user_test.go
Normal file
@ -0,0 +1,157 @@
|
||||
package endpoints
|
||||
|
||||
import (
|
||||
"git.dragse.it/anthrove/e621-to-graph/pkg/e621/model"
|
||||
"github.com/jarcoal/httpmock"
|
||||
"net/http"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGetUser(t *testing.T) {
|
||||
httpmock.Activate()
|
||||
defer httpmock.DeactivateAndReset()
|
||||
|
||||
userResponse := model.User{
|
||||
WikiPageVersionCount: 0,
|
||||
ArtistVersionCount: 0,
|
||||
PoolVersionCount: 0,
|
||||
ForumPostCount: 0,
|
||||
CommentCount: 69,
|
||||
FlagCount: 0,
|
||||
FavoriteCount: 1337,
|
||||
PositiveFeedbackCount: 0,
|
||||
NeutralFeedbackCount: 0,
|
||||
NegativeFeedbackCount: 0,
|
||||
UploadLimit: 0,
|
||||
ID: 1,
|
||||
CreatedAt: "2020-04-07T07:16:40.286+02:00",
|
||||
Name: "MaxMustermannDer69ste",
|
||||
Level: 0,
|
||||
BaseUploadLimit: 0,
|
||||
PostUploadCount: 0,
|
||||
PostUpdateCount: 0,
|
||||
NoteUpdateCount: 0,
|
||||
IsBanned: false,
|
||||
CanApprovePosts: false,
|
||||
CanUploadFree: false,
|
||||
LevelString: "Member",
|
||||
AvatarID: 7,
|
||||
}
|
||||
|
||||
jsonResponser, err := httpmock.NewJsonResponder(200, userResponse)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
httpmock.RegisterResponder("GET", "https://e621.net/users/MaxMustermannDer69ste.json", jsonResponser)
|
||||
|
||||
requestContext := model.RequestContext{
|
||||
Host: "https://e621.net",
|
||||
UserAgent: "Go-e621-SDK (@username)",
|
||||
Username: "memo",
|
||||
APIKey: "123456",
|
||||
}
|
||||
|
||||
client := http.Client{}
|
||||
user, err := GetUser(client, requestContext, "MaxMustermannDer69ste")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
if user.ID == userResponse.ID && user.Name == userResponse.Name && user.CreatedAt == user.CreatedAt {
|
||||
return
|
||||
}
|
||||
|
||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, userResponse)
|
||||
|
||||
}
|
||||
|
||||
func TestGetUsers(t *testing.T) {
|
||||
httpmock.Activate()
|
||||
defer httpmock.DeactivateAndReset()
|
||||
|
||||
userResponse := []model.User{
|
||||
{
|
||||
|
||||
WikiPageVersionCount: 0,
|
||||
ArtistVersionCount: 0,
|
||||
PoolVersionCount: 0,
|
||||
ForumPostCount: 0,
|
||||
CommentCount: 69,
|
||||
FlagCount: 0,
|
||||
FavoriteCount: 1337,
|
||||
PositiveFeedbackCount: 0,
|
||||
NeutralFeedbackCount: 0,
|
||||
NegativeFeedbackCount: 0,
|
||||
UploadLimit: 0,
|
||||
ID: 1,
|
||||
CreatedAt: "2020-04-07T07:16:40.286+02:00",
|
||||
Name: "MaxMustermannDer69ste",
|
||||
Level: 0,
|
||||
BaseUploadLimit: 0,
|
||||
PostUploadCount: 0,
|
||||
PostUpdateCount: 0,
|
||||
NoteUpdateCount: 0,
|
||||
IsBanned: false,
|
||||
CanApprovePosts: false,
|
||||
CanUploadFree: false,
|
||||
LevelString: "Member",
|
||||
AvatarID: 7,
|
||||
},
|
||||
{
|
||||
WikiPageVersionCount: 0,
|
||||
ArtistVersionCount: 0,
|
||||
PoolVersionCount: 0,
|
||||
ForumPostCount: 0,
|
||||
CommentCount: 1337,
|
||||
FlagCount: 0,
|
||||
FavoriteCount: 69,
|
||||
PositiveFeedbackCount: 0,
|
||||
NeutralFeedbackCount: 0,
|
||||
NegativeFeedbackCount: 0,
|
||||
UploadLimit: 0,
|
||||
ID: 1,
|
||||
CreatedAt: "2020-04-08T07:16:40.286+02:00",
|
||||
Name: "HollaDieWaldfee",
|
||||
Level: 0,
|
||||
BaseUploadLimit: 0,
|
||||
PostUploadCount: 0,
|
||||
PostUpdateCount: 0,
|
||||
NoteUpdateCount: 0,
|
||||
IsBanned: false,
|
||||
CanApprovePosts: false,
|
||||
CanUploadFree: false,
|
||||
LevelString: "Member",
|
||||
AvatarID: 16,
|
||||
},
|
||||
}
|
||||
|
||||
jsonResponser, err := httpmock.NewJsonResponder(200, userResponse)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
httpmock.RegisterResponder("GET", "https://e621.net/users.json", jsonResponser)
|
||||
|
||||
requestContext := model.RequestContext{
|
||||
Host: "https://e621.net",
|
||||
UserAgent: "Go-e621-SDK (@username)",
|
||||
Username: "memo",
|
||||
APIKey: "123456",
|
||||
}
|
||||
|
||||
client := http.Client{}
|
||||
user, err := GetUsers(client, requestContext, map[string]string{})
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
if len(user) == 2 && user[0].ID == userResponse[0].ID && user[1].Name == userResponse[1].Name {
|
||||
return
|
||||
}
|
||||
|
||||
t.Errorf("Respons did not match mock data:\nOriginal: %v\nMock: %v", user, userResponse)
|
||||
|
||||
}
|
8
pkg/e621/model/basic.go
Normal file
8
pkg/e621/model/basic.go
Normal file
@ -0,0 +1,8 @@
|
||||
package model
|
||||
|
||||
type RequestContext struct {
|
||||
Host string
|
||||
UserAgent string
|
||||
Username string
|
||||
APIKey string
|
||||
}
|
28
pkg/e621/model/user.go
Normal file
28
pkg/e621/model/user.go
Normal file
@ -0,0 +1,28 @@
|
||||
package model
|
||||
|
||||
type User struct {
|
||||
WikiPageVersionCount int64 `json:"wiki_page_version_count"`
|
||||
ArtistVersionCount int64 `json:"artist_version_count"`
|
||||
PoolVersionCount int64 `json:"pool_version_count"`
|
||||
ForumPostCount int64 `json:"forum_post_count"`
|
||||
CommentCount int64 `json:"comment_count"`
|
||||
FlagCount int64 `json:"flag_count"`
|
||||
FavoriteCount int64 `json:"favorite_count"`
|
||||
PositiveFeedbackCount int64 `json:"positive_feedback_count"`
|
||||
NeutralFeedbackCount int64 `json:"neutral_feedback_count"`
|
||||
NegativeFeedbackCount int64 `json:"negative_feedback_count"`
|
||||
UploadLimit int64 `json:"upload_limit"`
|
||||
ID int64 `json:"id"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
Name string `json:"name"`
|
||||
Level int64 `json:"level"`
|
||||
BaseUploadLimit int64 `json:"base_upload_limit"`
|
||||
PostUploadCount int64 `json:"post_upload_count"`
|
||||
PostUpdateCount int64 `json:"post_update_count"`
|
||||
NoteUpdateCount int64 `json:"note_update_count"`
|
||||
IsBanned bool `json:"is_banned"`
|
||||
CanApprovePosts bool `json:"can_approve_posts"`
|
||||
CanUploadFree bool `json:"can_upload_free"`
|
||||
LevelString string `json:"level_string"`
|
||||
AvatarID interface{} `json:"avatar_id"`
|
||||
}
|
Reference in New Issue
Block a user