Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"search.go",
"service.go",
"wild.go",
],
importpath = "go-common/app/interface/main/tv/service/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/tv/conf:go_default_library",
"//app/interface/main/tv/dao/archive:go_default_library",
"//app/interface/main/tv/dao/cms:go_default_library",
"//app/interface/main/tv/dao/search:go_default_library",
"//app/interface/main/tv/model:go_default_library",
"//app/interface/main/tv/model/search:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = [
"service_test.go",
"wild_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/tv/conf:go_default_library",
"//app/interface/main/tv/model/search:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,112 @@
package search
import (
"context"
"strconv"
"go-common/app/interface/main/tv/model"
searchMdl "go-common/app/interface/main/tv/model/search"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/xstr"
)
const (
_searchAll = "all_tv"
_searchPGC = "tv_pgc"
_searchUGC = "tv_ugc"
_typePGC = "pgc"
)
// SearchSug returns the result of search sug
func (s *Service) SearchSug(ctx context.Context, req *searchMdl.ReqSug) (result searchMdl.SugResponse, err error) {
if result, err = s.dao.SearchSug(ctx, req); err != nil {
return
}
build, _ := strconv.Atoi(req.Build)
if build != 0 && build <= s.conf.Search.SugPGCBuild && len(result.Result.Tag) > 0 {
var filtered = []*searchMdl.STag{}
for _, v := range result.Result.Tag {
if v.Type == _typePGC {
filtered = append(filtered, v)
}
}
result.Result.Tag = filtered
}
return
}
func (s *Service) batchToCommonPgc(ctx context.Context, input []*searchMdl.PgcResult) (output []*searchMdl.CommonResult) {
var (
err error
cids []int64
cmsRes map[int64]*model.SeasonCMS
)
for _, v := range input {
output = append(output, v.ToCommon())
cids = append(cids, int64(v.ID))
}
if cmsRes, err = s.cmsDao.LoadSnsCMSMap(ctx, cids); err != nil {
log.Error("[search.cornerMark] cids(%s) error(%v)", xstr.JoinInts(cids), err)
return
}
for idx, v := range output {
if r, ok := cmsRes[int64(v.ID)]; ok && r.NeedVip() {
output[idx].CornerMark = &(*s.conf.Cfg.SnVipCorner)
}
}
return
}
func batchToCommonUgc(input []*searchMdl.UgcResult) (output []*searchMdl.CommonResult) {
for _, v := range input {
output = append(output, v.ToCommon())
}
return
}
// SearchRes distinguishes the search type and pick the result
func (s *Service) SearchRes(ctx context.Context, req *searchMdl.ReqSearch) (data *searchMdl.RespForClient, err error) {
var resCommon *searchMdl.ResultResponse
data = &searchMdl.RespForClient{
SearchType: req.SearchType,
}
switch req.SearchType {
case _searchAll:
var resAll searchMdl.RespAll
if resAll, resCommon, err = s.dao.SearchAll(ctx, req); err != nil {
return
}
if resAll.PageInfo != nil {
data.PageInfo = resAll.PageInfo
}
if resAll.Result != nil {
data.ResultAll = &searchMdl.AllForClient{
Pgc: s.batchToCommonPgc(ctx, resAll.Result.Pgc),
Ugc: batchToCommonUgc(resAll.Result.Ugc),
}
}
case _searchPGC:
var resPgc searchMdl.RespPgc
if resPgc, resCommon, err = s.dao.SearchPgc(ctx, req); err != nil {
return
}
data.PGC = s.batchToCommonPgc(ctx, resPgc.Result)
case _searchUGC:
if req.Category == 0 { // in case of ugc, must have category
err = ecode.RequestErr
return
}
var resUgc searchMdl.RespUgc
if resUgc, resCommon, err = s.dao.SearchUgc(ctx, req); err != nil {
return
}
data.UGC = batchToCommonUgc(resUgc.Result)
default:
data = nil
err = ecode.TvDangbeiWrongType
return
}
data.ResultResponse = resCommon
return
}

View File

@@ -0,0 +1,27 @@
package search
import (
"go-common/app/interface/main/tv/conf"
arcdao "go-common/app/interface/main/tv/dao/archive"
cmsDao "go-common/app/interface/main/tv/dao/cms"
"go-common/app/interface/main/tv/dao/search"
)
// Service .
type Service struct {
conf *conf.Config
dao *search.Dao
arcDao *arcdao.Dao
cmsDao *cmsDao.Dao
}
// New .
func New(c *conf.Config) *Service {
srv := &Service{
conf: c,
dao: search.New(c),
arcDao: arcdao.New(c),
cmsDao: cmsDao.New(c),
}
return srv
}

View File

@@ -0,0 +1,30 @@
package search
import (
"flag"
"path/filepath"
"time"
"go-common/app/interface/main/tv/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
srv *Service
)
func init() {
dir, _ := filepath.Abs("../../cmd/tv-interface.toml")
flag.Set("conf", dir)
conf.Init()
srv = New(conf.Conf)
time.Sleep(time.Second)
}
func WithService(f func(s *Service)) func() {
return func() {
Reset(func() {})
f(srv)
}
}

View File

@@ -0,0 +1,242 @@
package search
import (
"context"
mdlSearch "go-common/app/interface/main/tv/model/search"
v1 "go-common/app/service/main/archive/api"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
const (
_showHide = 0
season = "番剧"
upper = "用户"
movie = "影视"
_searchType = "all"
_mobiAPP = "app"
_bangumiType = 1
_biliUserType = 2
_filmType = 3
_mediaBangumiType = 7
_mediaFtType = 8
)
// UserSearch search user .
func (s *Service) UserSearch(ctx context.Context, arg *mdlSearch.UserSearch) (res []*mdlSearch.User, err error) {
if res, err = s.dao.UserSearch(ctx, arg); err != nil {
log.Error("s.dao.UserSearch error(%v)", err)
}
if len(res) == 0 {
res = make([]*mdlSearch.User, 0)
}
return
}
// SearchAll search all .
func (s *Service) SearchAll(ctx context.Context, arg *mdlSearch.UserSearch) (res *mdlSearch.ResultAll, err error) {
var (
user = &mdlSearch.Search{}
avm map[int64]*v1.Arc
avids []int64
items []*mdlSearch.Item
wildCfg = s.conf.Wild.WildSearch
)
arg.SeasonNum = wildCfg.SeasonNum
arg.MovieNum = wildCfg.MovieNum
arg.SearchType = _searchType
arg.MobiAPP = _mobiAPP
if user, err = s.dao.SearchAllWild(ctx, arg); err != nil {
log.Error(" s.dao.SearchAllWild error(%v)", err)
}
res = &mdlSearch.ResultAll{}
if user == nil {
return
}
res.Trackid = user.Trackid
res.Page = user.Page
res.Attribute = user.Attribute
nis := make([]*mdlSearch.NavInfo, 0, 4)
// season
if user.PageInfo.Bangumi != nil {
var nav = &mdlSearch.NavInfo{
Name: season,
Total: user.PageInfo.Bangumi.NumResult,
Pages: user.PageInfo.Bangumi.Pages,
Type: _bangumiType,
}
if user.PageInfo.Bangumi.NumResult > wildCfg.SeasonNum {
nav.Show = wildCfg.SeasonMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// media season
if user.PageInfo.MediaBangumi != nil {
var nav = &mdlSearch.NavInfo{
Name: season,
Total: user.PageInfo.MediaBangumi.NumResult,
Pages: user.PageInfo.MediaBangumi.Pages,
Type: _mediaBangumiType,
}
if user.PageInfo.MediaBangumi.NumResult > wildCfg.SeasonNum {
nav.Show = wildCfg.SeasonMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// upper
if user.PageInfo.BiliUser != nil {
var nav = &mdlSearch.NavInfo{
Name: upper,
Total: user.PageInfo.BiliUser.NumResult,
Pages: user.PageInfo.BiliUser.Pages,
Type: _biliUserType,
}
nis = append(nis, nav)
}
// movie
if user.PageInfo.Film != nil {
var nav = &mdlSearch.NavInfo{
Name: movie,
Total: user.PageInfo.Film.NumResult,
Pages: user.PageInfo.Film.Pages,
Type: _filmType,
}
if user.PageInfo.Movie != nil && user.PageInfo.Movie.NumResult > wildCfg.MovieNum {
nav.Show = wildCfg.MovieMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// media movie
if user.PageInfo.MediaFt != nil {
var nav = &mdlSearch.NavInfo{
Name: movie,
Total: user.PageInfo.MediaFt.NumResult,
Pages: user.PageInfo.MediaFt.Pages,
Type: _mediaFtType,
}
if user.PageInfo.MediaFt.NumResult > wildCfg.MovieNum {
nav.Show = wildCfg.MovieMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
res.NavInfo = nis
// archive
for _, v := range user.Result.Video {
avids = append(avids, v.ID)
}
for _, v := range user.Result.Movie {
if v.Type == "movie" {
avids = append(avids, v.Aid)
}
}
if arg.Page == 1 {
for _, v := range user.Result.User {
for _, vr := range v.Res {
avids = append(avids, vr.Aid)
}
}
for _, v := range user.Result.BiliUser {
for _, vr := range v.Res {
avids = append(avids, vr.Aid)
}
}
}
group := new(errgroup.Group)
if len(avids) != 0 {
group.Go(func() (err error) {
if avm, err = s.arcDao.Archives(ctx, avids); err != nil {
log.Error("%+v", err)
err = nil
}
return
})
}
if err = group.Wait(); err != nil {
return
}
// item add data .
var promptBangumi, promptFt string
// season
bangumi := user.Result.Bangumi
items = make([]*mdlSearch.Item, 0, len(bangumi))
for _, v := range bangumi {
si := &mdlSearch.Item{}
si.FromSeason(v, mdlSearch.GotoBangumiWeb)
items = append(items, si)
}
if len(res.Items.Season) > 5 && arg.RID == 0 {
res.Items.Season = res.Items.Season[:5]
res.Items.Season = items
} else {
res.Items.Season = items
}
// movie
movie := user.Result.Movie
items = make([]*mdlSearch.Item, 0, len(movie))
for _, v := range movie {
si := &mdlSearch.Item{}
si.FromMovie(v, avm)
items = append(items, si)
}
res.Items.Movie = items
// season2
mb := user.Result.MediaBangumi
// movie2
mf := user.Result.MediaFt
items = make([]*mdlSearch.Item, 0, len(mb)+len(mf))
for _, v := range mb {
si := &mdlSearch.Item{}
si.FromMedia(v, promptBangumi, mdlSearch.GotoBangumi, nil)
items = append(items, si)
}
for _, v := range mf {
si := &mdlSearch.Item{}
si.FromMedia(v, promptFt, mdlSearch.GotoMovie, nil)
si.Goto = mdlSearch.GotoAv
items = append(items, si)
}
if len(res.Items.Season2) > 5 && arg.RID == 0 {
res.Items.Season2 = res.Items.Season2[:5]
res.Items.Season2 = items
} else {
res.Items.Season2 = items
}
items = make([]*mdlSearch.Item, 0, len(user.Result.Video))
for _, v := range user.Result.Video {
si := &mdlSearch.Item{}
si.FromVideo(v, avm[v.ID])
items = append(items, si)
}
res.Items.Archive = items
return
}
// PgcSearch search .
func (s *Service) PgcSearch(ctx context.Context, arg *mdlSearch.UserSearch) (res *mdlSearch.TypeSearch, err error) {
var (
wildCfg = s.conf.Wild.WildSearch
)
arg.SeasonNum = wildCfg.SeasonNum
arg.MovieNum = wildCfg.MovieNum
arg.SearchType = _searchType
arg.MobiAPP = _mobiAPP
if res, err = s.dao.PgcSearch(ctx, arg); err != nil {
log.Error("[wild.PgcSearch] s.dao.PgcSearch error(%v)", err)
return
}
if len(res.Items) <= 0 {
res.Items = make([]*mdlSearch.Item, 0)
}
return
}

View File

@@ -0,0 +1,55 @@
package search
import (
"context"
"testing"
mdlSearch "go-common/app/interface/main/tv/model/search"
. "github.com/smartystreets/goconvey/convey"
)
func TestService_UserSearch(t *testing.T) {
Convey("test user search", t, WithService(func(s *Service) {
arg := &mdlSearch.UserSearch{
Keyword: "lex",
Build: "111",
SearchType: "all",
Page: 1,
Pagesize: 20,
}
res, err := s.UserSearch(context.Background(), arg)
So(err, ShouldBeNil)
So(len(res), ShouldNotBeEmpty)
}))
}
func TestService_SearchAll(t *testing.T) {
Convey("test search all", t, WithService(func(s *Service) {
arg := &mdlSearch.UserSearch{
Keyword: "工作细胞",
Build: "111",
SearchType: "bili_user",
Page: 1,
Pagesize: 20,
}
res, err := s.SearchAll(context.Background(), arg)
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
}))
}
func TestService_PgcSearch(t *testing.T) {
Convey("test pgc search", t, WithService(func(s *Service) {
arg := &mdlSearch.UserSearch{
Keyword: "工作细胞",
Build: "111",
SearchType: "all",
Page: 1,
Pagesize: 20,
}
res, err := s.PgcSearch(context.Background(), arg)
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
}))
}