90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
|
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
|
||
|
}
|