Seperate API from UI

This commit is contained in:
video-prize-ranch 2023-01-01 15:12:03 -05:00
parent e03abd0ab9
commit a3feae6b30
No known key found for this signature in database
11 changed files with 79 additions and 58 deletions

View File

@ -6,7 +6,6 @@ import (
"codeberg.org/video-prize-ranch/rimgo/utils" "codeberg.org/video-prize-ranch/rimgo/utils"
"github.com/microcosm-cc/bluemonday" "github.com/microcosm-cc/bluemonday"
"github.com/patrickmn/go-cache"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
) )
@ -35,69 +34,67 @@ type Media struct {
MimeType string MimeType string
} }
var albumCache = cache.New(1*time.Hour, 15*time.Minute) func (client *Client) FetchAlbum(albumID string) (Album, error) {
cacheData, found := client.Cache.Get(albumID + "-album")
func FetchAlbum(albumID string) (Album, error) {
cacheData, found := albumCache.Get(albumID + "-album")
if found { if found {
return cacheData.(Album), nil return cacheData.(Album), nil
} }
data, err := utils.GetJSON("https://api.imgur.com/post/v1/albums/" + albumID + "?client_id=" + utils.Config.ImgurId + "&include=media%2Caccount") data, err := utils.GetJSON("https://api.imgur.com/post/v1/albums/" + albumID + "?client_id=" + client.ClientID + "&include=media%2Caccount")
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
album, err := ParseAlbum(data) album, err := parseAlbum(data)
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
albumCache.Set(albumID+"-album", album, cache.DefaultExpiration) client.Cache.Set(albumID+"-album", album, 1*time.Hour)
return album, err return album, err
} }
func FetchPosts(albumID string) (Album, error) { func (client *Client) FetchPosts(albumID string) (Album, error) {
cacheData, found := albumCache.Get(albumID + "-posts") cacheData, found := client.Cache.Get(albumID + "-posts")
if found { if found {
return cacheData.(Album), nil return cacheData.(Album), nil
} }
data, err := utils.GetJSON("https://api.imgur.com/post/v1/posts/" + albumID + "?client_id=" + utils.Config.ImgurId + "&include=media%2Caccount%2Ctags") data, err := utils.GetJSON("https://api.imgur.com/post/v1/posts/" + albumID + "?client_id=" + client.ClientID + "&include=media%2Caccount%2Ctags")
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
album, err := ParseAlbum(data) album, err := parseAlbum(data)
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
albumCache.Set(albumID+"-posts", album, cache.DefaultExpiration) client.Cache.Set(albumID+"-posts", album, 1*time.Hour)
return album, nil return album, nil
} }
func FetchMedia(mediaID string) (Album, error) { func (client *Client) FetchMedia(mediaID string) (Album, error) {
cacheData, found := albumCache.Get(mediaID + "-media") cacheData, found := client.Cache.Get(mediaID + "-media")
if found { if found {
return cacheData.(Album), nil return cacheData.(Album), nil
} }
data, err := utils.GetJSON("https://api.imgur.com/post/v1/media/" + mediaID + "?client_id=" + utils.Config.ImgurId + "&include=media%2Caccount") data, err := utils.GetJSON("https://api.imgur.com/post/v1/media/" + mediaID + "?client_id=" + client.ClientID + "&include=media%2Caccount")
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
album, err := ParseAlbum(data) album, err := parseAlbum(data)
if err != nil { if err != nil {
return Album{}, err return Album{}, err
} }
albumCache.Set(mediaID+"-media", album, cache.DefaultExpiration) client.Cache.Set(mediaID+"-media", album, 1*time.Hour)
return album, nil return album, nil
} }
func ParseAlbum(data gjson.Result) (Album, error) { func parseAlbum(data gjson.Result) (Album, error) {
media := make([]Media, 0) media := make([]Media, 0)
data.Get("media").ForEach( data.Get("media").ForEach(
func(key gjson.Result, value gjson.Result) bool { func(key gjson.Result, value gjson.Result) bool {

21
api/client.go Normal file
View File

@ -0,0 +1,21 @@
package api
import (
"time"
"github.com/patrickmn/go-cache"
)
type Client struct {
ClientID string
Cache *cache.Cache
}
func NewClient(clientId string) (*Client) {
client := Client{
ClientID: clientId,
Cache: cache.New(15*time.Minute, 15*time.Minute),
}
return &client
}

View File

@ -28,15 +28,13 @@ type Comment struct {
DeletedAt string DeletedAt string
} }
var commentCache = cache.New(15*time.Minute, 15*time.Minute) func (client *Client) FetchComments(galleryID string) ([]Comment, error) {
cacheData, found := client.Cache.Get(galleryID + "-comments")
func FetchComments(galleryID string) ([]Comment, error) {
cacheData, found := commentCache.Get(galleryID)
if found { if found {
return cacheData.([]Comment), nil return cacheData.([]Comment), nil
} }
data, err := utils.GetJSON("https://api.imgur.com/comment/v1/comments?client_id=" + utils.Config.ImgurId + "&filter[post]=eq:" + galleryID + "&include=account,adconfig&per_page=30&sort=best") data, err := utils.GetJSON("https://api.imgur.com/comment/v1/comments?client_id=" + client.ClientID + "&filter[post]=eq:" + galleryID + "&include=account,adconfig&per_page=30&sort=best")
if err != nil { if err != nil {
return []Comment{}, nil return []Comment{}, nil
} }
@ -49,7 +47,7 @@ func FetchComments(galleryID string) ([]Comment, error) {
go func() { go func() {
defer wg.Done() defer wg.Done()
comments = append(comments, ParseComment(value)) comments = append(comments, parseComment(value))
}() }()
return true return true
@ -57,7 +55,7 @@ func FetchComments(galleryID string) ([]Comment, error) {
) )
wg.Wait() wg.Wait()
commentCache.Set(galleryID, comments, cache.DefaultExpiration) client.Cache.Set(galleryID + "-comments", comments, cache.DefaultExpiration)
return comments, nil return comments, nil
} }
@ -66,7 +64,7 @@ var vidRe = regexp.MustCompile(`https?://i\.imgur\.com/(.*)\.(mp4|webm)`)
var vidFormatRe = regexp.MustCompile(`\.(mp4|webm)`) var vidFormatRe = regexp.MustCompile(`\.(mp4|webm)`)
var iImgurRe = regexp.MustCompile(`https?://i\.imgur\.com`) var iImgurRe = regexp.MustCompile(`https?://i\.imgur\.com`)
func ParseComment(data gjson.Result) Comment { func parseComment(data gjson.Result) Comment {
createdTime, _ := time.Parse("2006-01-02T15:04:05Z", data.Get("created_at").String()) createdTime, _ := time.Parse("2006-01-02T15:04:05Z", data.Get("created_at").String())
createdAt := createdTime.Format("January 2, 2006 3:04 PM") createdAt := createdTime.Format("January 2, 2006 3:04 PM")
updatedAt, _ := utils.FormatDate(data.Get("updated_at").String()) updatedAt, _ := utils.FormatDate(data.Get("updated_at").String())
@ -82,7 +80,7 @@ func ParseComment(data gjson.Result) Comment {
go func() { go func() {
defer wg.Done() defer wg.Done()
comments = append(comments, ParseComment(value)) comments = append(comments, parseComment(value))
}() }()
return true return true

View File

@ -5,9 +5,7 @@ import (
"net/http" "net/http"
"strings" "strings"
"sync" "sync"
"time"
"codeberg.org/video-prize-ranch/rimgo/utils"
"github.com/patrickmn/go-cache" "github.com/patrickmn/go-cache"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
) )
@ -22,10 +20,8 @@ type Tag struct {
BackgroundId string BackgroundId string
} }
var tagCache = cache.New(15*time.Minute, 15*time.Minute) func (client *Client) FetchTag(tag string, sort string, page string) (Tag, error) {
cacheData, found := client.Cache.Get(tag + sort + page + "-tag")
func FetchTag(tag string, sort string, page string) (Tag, error) {
cacheData, found := tagCache.Get(tag + sort + page)
if found { if found {
return cacheData.(Tag), nil return cacheData.(Tag), nil
} }
@ -36,7 +32,7 @@ func FetchTag(tag string, sort string, page string) (Tag, error) {
} }
q := req.URL.Query() q := req.URL.Query()
q.Add("client_id", utils.Config.ImgurId) q.Add("client_id", client.ClientID)
q.Add("include", "cover") q.Add("include", "cover")
q.Add("page", page) q.Add("page", page)
@ -109,6 +105,6 @@ func FetchTag(tag string, sort string, page string) (Tag, error) {
Background: "/" + data.Get("background_id").String() + ".webp", Background: "/" + data.Get("background_id").String() + ".webp",
} }
tagCache.Set(tag, tagData, cache.DefaultExpiration) client.Cache.Set(tag + sort + page + "-tag", tagData, cache.DefaultExpiration)
return tagData, nil return tagData, nil
} }

View File

@ -8,7 +8,6 @@ import (
"time" "time"
"codeberg.org/video-prize-ranch/rimgo/utils" "codeberg.org/video-prize-ranch/rimgo/utils"
"github.com/patrickmn/go-cache"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
) )
@ -35,10 +34,8 @@ type Submission struct {
IsAlbum bool IsAlbum bool
} }
var userCache = cache.New(30*time.Minute, 15*time.Minute) func (client *Client) FetchUser(username string) (User, error) {
cacheData, found := client.Cache.Get(username + "-user")
func FetchUser(username string) (User, error) {
cacheData, found := userCache.Get(username)
if found { if found {
return cacheData.(User), nil return cacheData.(User), nil
} }
@ -67,12 +64,12 @@ func FetchUser(username string) (User, error) {
CreatedAt: createdTime.Format("January 2, 2006"), CreatedAt: createdTime.Format("January 2, 2006"),
} }
userCache.Set(username, user, 1*time.Hour) client.Cache.Set(username + "-user", user, 1*time.Hour)
return user, nil return user, nil
} }
func FetchSubmissions(username string, sort string, page string) ([]Submission, error) { func (client *Client) FetchSubmissions(username string, sort string, page string) ([]Submission, error) {
cacheData, found := userCache.Get(username + "-submissions") cacheData, found := client.Cache.Get(username + "-submissions")
if found { if found {
return cacheData.([]Submission), nil return cacheData.([]Submission), nil
} }
@ -131,6 +128,6 @@ func FetchSubmissions(username string, sort string, page string) ([]Submission,
) )
wg.Wait() wg.Wait()
userCache.Set(username + "-submissions", submissions, 15*time.Minute) client.Cache.Set(username + "-submissions", submissions, 15*time.Minute)
return submissions, nil return submissions, nil
} }

View File

@ -27,6 +27,8 @@ func main() {
} }
utils.LoadConfig() utils.LoadConfig()
pages.InitializeApiClient()
engine := handlebars.NewFileSystem(http.FS(views.GetFiles()), ".hbs") engine := handlebars.NewFileSystem(http.FS(views.GetFiles()), ".hbs")
engine.AddFunc("noteq", func(a interface{}, b interface{}, options *raymond.Options) interface{} { engine.AddFunc("noteq", func(a interface{}, b interface{}, options *raymond.Options) interface{} {

12
pages/apiClient.go Normal file
View File

@ -0,0 +1,12 @@
package pages
import (
"codeberg.org/video-prize-ranch/rimgo/api"
"codeberg.org/video-prize-ranch/rimgo/utils"
)
var ApiClient *api.Client
func InitializeApiClient() {
ApiClient = api.NewClient(utils.Config.ImgurId)
}

View File

@ -16,11 +16,11 @@ func HandleEmbed(c *fiber.Ctx) error {
post, err := api.Album{}, error(nil) post, err := api.Album{}, error(nil)
switch { switch {
case strings.HasPrefix(c.Path(), "/a"): case strings.HasPrefix(c.Path(), "/a"):
post, err = api.FetchAlbum(c.Params("postID")) post, err = ApiClient.FetchAlbum(c.Params("postID"))
case strings.HasPrefix(c.Path(), "/gallery"): case strings.HasPrefix(c.Path(), "/gallery"):
post, err = api.FetchPosts(c.Params("postID")) post, err = ApiClient.FetchPosts(c.Params("postID"))
default: default:
post, err = api.FetchMedia(c.Params("postID")) post, err = ApiClient.FetchMedia(c.Params("postID"))
} }
if err != nil && err.Error() == "ratelimited by imgur" { if err != nil && err.Error() == "ratelimited by imgur" {
return c.Status(429).Render("errors/429", nil) return c.Status(429).Render("errors/429", nil)

View File

@ -17,11 +17,11 @@ func HandlePost(c *fiber.Ctx) error {
post, err := api.Album{}, error(nil) post, err := api.Album{}, error(nil)
switch { switch {
case strings.HasPrefix(c.Path(), "/a"): case strings.HasPrefix(c.Path(), "/a"):
post, err = api.FetchAlbum(c.Params("postID")) post, err = ApiClient.FetchAlbum(c.Params("postID"))
case strings.HasPrefix(c.Path(), "/gallery"): case strings.HasPrefix(c.Path(), "/gallery"):
post, err = api.FetchPosts(c.Params("postID")) post, err = ApiClient.FetchPosts(c.Params("postID"))
default: default:
post, err = api.FetchMedia(c.Params("postID")) post, err = ApiClient.FetchMedia(c.Params("postID"))
} }
if err != nil && err.Error() == "ratelimited by imgur" { if err != nil && err.Error() == "ratelimited by imgur" {
return c.Status(429).Render("errors/429", nil) return c.Status(429).Render("errors/429", nil)
@ -36,7 +36,7 @@ func HandlePost(c *fiber.Ctx) error {
comments := []api.Comment{} comments := []api.Comment{}
if post.SharedWithCommunity { if post.SharedWithCommunity {
c.Set("Cache-Control", "public,max-age=604800") c.Set("Cache-Control", "public,max-age=604800")
comments, err = api.FetchComments(c.Params("postID")) comments, err = ApiClient.FetchComments(c.Params("postID"))
if err != nil { if err != nil {
return err return err
} }

View File

@ -3,7 +3,6 @@ package pages
import ( import (
"strconv" "strconv"
"codeberg.org/video-prize-ranch/rimgo/api"
"codeberg.org/video-prize-ranch/rimgo/utils" "codeberg.org/video-prize-ranch/rimgo/utils"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
) )
@ -29,7 +28,7 @@ func HandleTag(c *fiber.Ctx) error {
displayPrevPage = false displayPrevPage = false
} }
tag, err := api.FetchTag(c.Params("tag"), c.Query("sort"), page) tag, err := ApiClient.FetchTag(c.Params("tag"), c.Query("sort"), page)
if err != nil && err.Error() == "ratelimited by imgur" { if err != nil && err.Error() == "ratelimited by imgur" {
return c.Status(429).Render("errors/429", nil) return c.Status(429).Render("errors/429", nil)
} }

View File

@ -3,7 +3,6 @@ package pages
import ( import (
"strconv" "strconv"
"codeberg.org/video-prize-ranch/rimgo/api"
"codeberg.org/video-prize-ranch/rimgo/utils" "codeberg.org/video-prize-ranch/rimgo/utils"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
) )
@ -24,7 +23,7 @@ func HandleUser(c *fiber.Ctx) error {
pageNumber = 0 pageNumber = 0
} }
user, err := api.FetchUser(c.Params("userID")) user, err := ApiClient.FetchUser(c.Params("userID"))
if err != nil && err.Error() == "ratelimited by imgur" { if err != nil && err.Error() == "ratelimited by imgur" {
return c.Status(429).Render("errors/429", nil) return c.Status(429).Render("errors/429", nil)
} }
@ -35,7 +34,7 @@ func HandleUser(c *fiber.Ctx) error {
return c.Status(404).Render("errors/404", nil) return c.Status(404).Render("errors/404", nil)
} }
submissions, err := api.FetchSubmissions(c.Params("userID"), "newest", page) submissions, err := ApiClient.FetchSubmissions(c.Params("userID"), "newest", page)
if err != nil && err.Error() == "ratelimited by imgur" { if err != nil && err.Error() == "ratelimited by imgur" {
c.Status(429) c.Status(429)
return c.Render("errors/429", nil) return c.Render("errors/429", nil)