/
service.go
80 lines (65 loc) · 1.79 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package musics
import (
"encoding/json"
"go.uber.org/zap"
)
type Order string
const (
OrderByViewCount Order = "viewCount"
OrderByDate = "date"
OrderByDefault = "relevance"
)
func (o Order) String() string {
switch o {
case OrderByViewCount:
return "viewCount"
case OrderByDate:
return "date"
default:
return "relevance"
}
}
type Service interface {
GetMusic(videoID string) (*Music, error)
GetMusics(videoIDs []string) (Musics, error)
GetMusicList(query string, pageToken string) (*MusicListDto, error)
GetPlayListBy(order Order, pageToken string) (*MusicListDto, error)
}
type MusicListDto struct {
Musics *Musics
NextPageToken string // optional
}
type musicService struct {
logger *zap.SugaredLogger
musicRepository MusicRepository
}
func NewMusicService(l *zap.SugaredLogger, mr MusicRepository) Service {
return &musicService{logger: l, musicRepository: mr}
}
func (ms *musicService) GetPlayListBy(order Order, pageToken string) (*MusicListDto, error) {
return ms.musicRepository.GetPlayListBy(order.String(), pageToken)
}
func (ms *musicService) GetMusicList(query string, pageToken string) (*MusicListDto, error) {
musics, isCached, err := ms.musicRepository.GetMusicList(query, pageToken)
if err != nil {
return nil, err
}
if !isCached {
musicsBytes, err := json.Marshal(musics)
if err != nil {
return nil, err
}
err = ms.musicRepository.SaveMusicList(GenerateCacheKey(query, pageToken), musicsBytes)
if err != nil {
return nil, err
}
return musics, nil
}
return musics, nil
}
func (ms *musicService) GetMusic(videoID string) (*Music, error) {
return ms.musicRepository.GetMusic(videoID)
}
func (ms *musicService) GetMusics(videoIDs []string) (Musics, error) {
return ms.musicRepository.GetMusicsByIDs(videoIDs)
}