indiescrobble/services/scrobble/scrobbler.go

90 lines
1.9 KiB
Go
Raw Normal View History

2022-02-19 15:47:25 +00:00
package scrobble
import (
"fmt"
"net/url"
"git.jamesravey.me/ravenscroftj/indiescrobble/models"
"git.jamesravey.me/ravenscroftj/indiescrobble/services/micropub"
"gorm.io/gorm"
)
type Scrobbler struct {
db *gorm.DB
}
func NewScrobbler(db *gorm.DB) *Scrobbler{
return &Scrobbler{db:db}
}
func (s *Scrobbler) ValidateType(form *url.Values) error {
scrobbleType := form.Get("type")
if _, ok := ScrobbleTypeNames[scrobbleType]; !ok{
return fmt.Errorf("Unknown/invalid scrobble type %v", scrobbleType)
}
return nil
}
func (s *Scrobbler) GetItemByID(form *url.Values) (ScrobbleMetaRecord, error) {
if err := s.ValidateType(form); err != nil {
return nil, err
}
searchEngine := NewSearchProvider(form.Get("type"), s.db)
item, err := searchEngine.SearchProvider.GetItem(form.Get("item"))
if err != nil{
return nil, err
}
return item, nil
}
func (s *Scrobbler) Search(form *url.Values) ([]ScrobbleMetaRecord, error) {
if err := s.ValidateType(form); err != nil {
return nil, err
}
searchEngine := NewSearchProvider(form.Get("type"), s.db)
query := form.Get("q")
return searchEngine.SearchProvider.Search(query)
}
func (s *Scrobbler) GetSearchEngineNameForType(scrobbleType string) string {
return NewSearchProvider(scrobbleType, s.db).SearchProvider.GetName()
}
func (s *Scrobbler) Scrobble(form *url.Values, currentUser *models.BaseUser) (*models.Post, error) {
if err := s.ValidateType(form); err != nil{
return nil, err
}
item := models.MediaItem{}
result := s.db.Where(&models.MediaItem{MediaID: form.Get("item")}).First(&item)
if result.Error != nil{
return nil, result.Error
}
discovery := micropub.MicropubDiscoveryService{}
mediaItem := models.MediaItem{}
post := models.Post{MediaItem: mediaItem, User: *currentUser.UserRecord, PostType: form.Get("type") }
discovery.SubmitScrobble(currentUser, &post)
return &post, nil
}