Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-channel/cmd:all-srcs",
"//app/interface/main/app-channel/conf:all-srcs",
"//app/interface/main/app-channel/dao/account:all-srcs",
"//app/interface/main/app-channel/dao/activity:all-srcs",
"//app/interface/main/app-channel/dao/archive:all-srcs",
"//app/interface/main/app-channel/dao/article:all-srcs",
"//app/interface/main/app-channel/dao/audio:all-srcs",
"//app/interface/main/app-channel/dao/audit:all-srcs",
"//app/interface/main/app-channel/dao/bangumi:all-srcs",
"//app/interface/main/app-channel/dao/card:all-srcs",
"//app/interface/main/app-channel/dao/converge:all-srcs",
"//app/interface/main/app-channel/dao/game:all-srcs",
"//app/interface/main/app-channel/dao/live:all-srcs",
"//app/interface/main/app-channel/dao/location:all-srcs",
"//app/interface/main/app-channel/dao/region:all-srcs",
"//app/interface/main/app-channel/dao/relation:all-srcs",
"//app/interface/main/app-channel/dao/shopping:all-srcs",
"//app/interface/main/app-channel/dao/special:all-srcs",
"//app/interface/main/app-channel/dao/tab:all-srcs",
"//app/interface/main/app-channel/dao/tag:all-srcs",
"//app/interface/main/app-channel/http:all-srcs",
"//app/interface/main/app-channel/model:all-srcs",
"//app/interface/main/app-channel/service/channel:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,237 @@
#### App channel 移动端运营类接口
##### Version 2.1.15
> 1.Archive3 改成 Arc
##### Version 2.1.14
> 1.拜年祭秒开版本限制
##### Version 2.1.13
> 1.蓝强转粉逻辑修改
##### Version 2.1.11
> 1.蓝强转粉逻辑修改
##### Version 2.1.9
> 1.频道蓝强转粉
##### Version 2.1.8
> 1.审核版本屏蔽原创排行榜入口
##### Version 2.1.7
> 1.新接口多机房走云立方
##### Version 2.1.6
> 1.频道tablist
##### Version 2.1.4
> 1.PGC卡片统一epid
##### Version 2.1.3
> 1.ecode init
##### Version 2.1.2
> 1.广场频道数量配置
##### Version 2.1.1
> 1.频道运营卡片buvid缓存
##### Version 2.1.0
> 1.去掉zlimit接入location
##### Version 2.0.21
> 1.频道分类国际版
> 2.分区海外默认繁体
##### Version 2.0.20
> 1.频道广场推荐频道改为4个
##### Version 2.0.19
> 1.频道广场推荐频道改为3个
##### Version 2.0.18
> 1.审核模式屏蔽排行榜入口
##### Version 2.0.17
> 1.频道海外版
##### Version 2.0.16
> 1.GRPC Panic
##### Version 2.0.15
> 1.UGC付费卡片
##### Version 2.0.14
> 1.PGC卡片展示后台配置的标题
##### Version 2.0.13
> 1.广场页接口拆除我的订阅卡片新增from_type字段
##### Version 2.0.12
> 1.修复infoc上报问题
##### Version 2.0.11
> 1.上报增加字段
##### Version 2.0.10
> 1.新接口上报修改
##### Version 2.0.9
> 1.老接口频道单推卡片URI问题
##### Version 2.0.8
> 1.新增PGC卡片、单推UP卡片
> 2.新增头图卡片
##### Version 2.0.7
> 1.频道广场页加更新类型参数
##### Version 2.0.6
> 1.频道广场页改版,我的订阅换新接口
##### Version 2.0.5
> 1.稿件UP头像和用户名数据源修改
##### Version 2.0.4
> 1.老接口频道id大于0频道name置为空
##### Version 2.0.3
> 1.频道id大于0频道name置为空
##### Version 2.0.2
> 1.专栏分区schema换成新地址
##### Version 2.0.1
> 1.频道list游戏中心写死from
##### Version 2.0.0
> 1.频道卡片重构
##### Version 1.2.7
> 1.频道详情页返回内容修改
##### Version 1.2.6
> 1.频道详情页返回code
##### Version 1.2.5
> 1.修复build限制问题
##### Version 1.2.4
> 1.分区build bug
##### Version 1.2.3
> 1.替换c.remoteip获取
##### Version 1.2.2
> 1.autoplay
##### Version 1.2.1
> 1.返回error修复
##### Version 1.2.0
> 1.使用grpc auth
##### Version 1.1.12
> 1.频道卡片增加cid
##### Version 1.1.11
> 1.直播卡片横竖屏
##### Version 1.1.10
> 1.分区去重修改
##### Version 1.1.9
> 1.fix avHandler
##### Version 1.1.8
> 1.av卡片展示desc为弹幕数
##### Version 1.1.7
> 1.UP三连推BUG修复
##### Version 1.1.6
> 1.频道稿件卡片返回竖屏URI信息
> 2.频道详情页关注三连卡片增加关注状态判断
##### Version 1.1.5
> 1.卡片和AI视频去重
##### Version 1.1.4
> 1.infoc上报修改
##### Version 1.1.3
> 1.分区多区间限制
##### Version 1.1.2
> 1.卡片增加字段
> 2.频道列表接口修改
##### Version 1.1.1
> 1.增加template
### Version 1.1.0
> 1. update infoc sdk
##### Version 1.0.1
> 1.分区去重处理
##### Version 1.0.0
> 1.项目初始化

View File

@@ -0,0 +1,11 @@
# Owner
peiyifei
liweijia
# Author
sunyu
luoxiaofan
# Reviewer
peiyifei
luoxiaofan

View File

@@ -0,0 +1,17 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- liweijia
- luoxiaofan
- peiyifei
- sunyu
labels:
- interface
- interface/main/app-channel
- main
options:
no_parent_owners: true
reviewers:
- luoxiaofan
- peiyifei
- sunyu

View File

@@ -0,0 +1,13 @@
#### app-channel
##### 项目简介
> 1.移动端频道类接口
##### 编译环境
> 请只用golang v1.8.x以上版本编译执行。
##### 依赖包
> 1.公共包go-common
##### 特别说明
> 1.model目录可能会被其他项目引用请谨慎请改并通知各方。

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["app-channel-test.toml"],
importpath = "go-common/app/interface/main/app-channel/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/http:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/trace: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"],
)

View File

@@ -0,0 +1,172 @@
# This is a TOML document. Boom.
version = "1.0.1"
user = "nobody"
pid = "/tmp/app-channel.pid"
dir = "./"
checkFile = "/data/www/app-channel.html"
family = "app-channel"
debug = false
tick = "1m"
squareCount = 2
[feedInfoc2]
taskID = "001131"
proto = "tcp"
addr = ""
chanSize = 10240
[channelInfoc2]
taskID = "001140"
proto = "tcp"
addr = ""
chanSize = 10240
[host]
liveApi = "http://api.live.bilibili.co"
bangumi = "http://bangumi.bilibili.co"
data = "http://data.bilibili.co"
apiCo = "http://api.bilibili.co"
activity = "http://matsuri.bilibili.co"
live = "http://live.bilibili.co"
shopping = "http://show.bilibili.com"
[log]
dir = "/data/log/app-channel/"
# [log.elk]
# project = "app-channel"
# addr = "172.18.20.17:8520"
# chanSize = 10240
[app]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
[httpClient]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpClientAsyn]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "1s"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClientAsyn.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpShopping]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "50ms"
timeout = "150ms"
keepAlive = "60s"
timer = 128
[httpShopping.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[identify]
whiteAccessKey = ""
whiteMid = 0
[identify.memcache]
name = "go-business/identify"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 5
idle = 1
dialTimeout = "30ms"
readTimeout = "70ms"
writeTimeout = "70ms"
idleTimeout = "80s"
[identify.host]
auth = "http://passport.bilibili.com"
secret = "http://open.bilibili.com"
[identify.httpClient]
key = "7c7ac0db1aa05587"
secret = "9a6d62d93290c5f771ad381e9ca23f26"
dial = "30ms"
timeout = "100ms"
keepAlive = "60s"
[identify.httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[identify.httpClient.url]
"http://passport.bilibili.co/intranet/auth/tokenInfo" = {timeout = "100ms"}
"http://passport.bilibili.co/intranet/auth/cookieInfo" = {timeout = "100ms"}
"http://open.bilibili.co/api/getsecret" = {timeout = "500ms"}
[bm]
[bm.outer]
addr = "0.0.0.0:7191"
timeout = "1s"
[mysql]
[mysql.show]
addr = "172.16.33.205:3308"
dsn = "test:test@tcp(172.16.33.205:3308)/bilibili_show?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
idleTimeout ="4h"
queryTimeout = "300ms"
execTimeout = "300ms"
tranTimeout = "300ms"
[mysql.show.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[mysql.manager]
addr = "172.16.33.205:3308"
dsn = "test:test@tcp(172.16.33.205:3308)/bilibili_manager?timeout=100ms&readTimeout=200ms&writeTimeout=200ms&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 2
idle = 1
idleTimeout = "4h"
queryTimeout = "1s"
execTimeout = "1s"
tranTimeout = "1s"
[mysql.manager.Breaker]
window = "1s"
sleep = "1s"
bucket = 10
ratio = 0.5
request = 100
[dislikeDatabus]
key = "0QNB0ZgFozbKUCQhbTq8"
secret = "0QNB0ZgFozbKUCQhbTq9"
group= "TagDislike-SkyHorse-P"
topic= "Dislike-T"
action="pub"
name = "app-feed/dislike"
proto = "tcp"
addr = "172.18.33.50:6205"
active = 5
idle = 1
dialTimeout = "30ms"
readTimeout = "80ms"
writeTimeout = "80ms"
idleTimeout = "80s"
expire = "1h"

View File

@@ -0,0 +1,49 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/http"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
log.Error("conf.Init() error(%v)", err)
panic(err)
}
ecode.Init(nil)
// init log
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("app-channel start")
// init trace
trace.Init(conf.Conf.Tracer)
defer trace.Close()
// service init
http.Init(conf.Conf)
// init pprof conf.Conf.Perf
// init signal
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("app-channel get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
log.Info("app-channel exit")
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/interface/main/app-channel/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/log/infoc:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/rpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/BurntSushi/toml: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"],
)

View File

@@ -0,0 +1,143 @@
package conf
import (
"errors"
"flag"
"go-common/library/cache/memcache"
"go-common/library/conf"
"go-common/library/database/sql"
"go-common/library/log"
"go-common/library/log/infoc"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/rpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
xtime "go-common/library/time"
"github.com/BurntSushi/toml"
)
var (
confPath string
Conf = &Config{}
client *conf.Client
)
type Config struct {
// Env
Env string
// show XLog
Log *log.Config
// tick time
Tick xtime.Duration
// tracer
Tracer *trace.Config
// httpClinet
HTTPClient *bm.ClientConfig
// httpClinetAsyn
HTTPClientAsyn *bm.ClientConfig
// HTTPShopping
HTTPShopping *bm.ClientConfig
// bm http
BM *HTTPServers
// host
Host *Host
// db
MySQL *MySQL
// rpc client
ArchiveRPC *rpc.ClientConfig
// rpc account
AccountRPC *rpc.ClientConfig
// relationRPC
RelationRPC *rpc.ClientConfig
// rpc client
TagRPC *rpc.ClientConfig
// rpc Article
ArticleRPC *rpc.ClientConfig
// rpc Location
LocationRPC *rpc.ClientConfig
// Infoc2
FeedInfoc2 *infoc.Config
ChannelInfoc2 *infoc.Config
// memcache
Memcache *Memcache
// BroadcastRPC grpc
PGCRPC *warden.ClientConfig
// Square Count
SquareCount int
}
type Host struct {
Bangumi string
Data string
APICo string
Activity string
LiveAPI string
Shopping string
}
type HTTPServers struct {
Outer *bm.ServerConfig
}
type MySQL struct {
Show *sql.Config
Manager *sql.Config
}
type Memcache struct {
Channels *struct {
*memcache.Config
Expire xtime.Duration
}
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init config.
func Init() (err error) {
if confPath != "" {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
err = remote()
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
client.Watch("app-channel.toml")
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["account_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["account.go"],
importpath = "go-common/app/interface/main/app-channel/dao/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,80 @@
package account
import (
"context"
"go-common/app/interface/main/app-channel/conf"
account "go-common/app/service/main/account/model"
accrpc "go-common/app/service/main/account/rpc/client"
"go-common/library/net/metadata"
"github.com/pkg/errors"
)
// Dao is archive dao.
type Dao struct {
// rpc
accRPC *accrpc.Service3
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// rpc
accRPC: accrpc.New3(c.AccountRPC),
}
return
}
// Relations3 relations.
func (d *Dao) Relations3(c context.Context, owners []int64, mid int64) (follows map[int64]bool) {
if len(owners) == 0 {
return nil
}
follows = make(map[int64]bool, len(owners))
for _, owner := range owners {
follows[owner] = false
}
var (
am map[int64]*account.Relation
err error
)
ip := metadata.String(c, metadata.RemoteIP)
arg := &account.ArgRelations{Owners: owners, Mid: mid, RealIP: ip}
if am, err = d.accRPC.Relations3(c, arg); err != nil {
return
}
for i, a := range am {
if _, ok := follows[i]; ok {
follows[i] = a.Following
}
}
return
}
func (d *Dao) Cards3(c context.Context, mids []int64) (res map[int64]*account.Card, err error) {
arg := &account.ArgMids{Mids: mids}
if res, err = d.accRPC.Cards3(c, arg); err != nil {
err = errors.Wrapf(err, "%v", arg)
}
return
}
func (d *Dao) IsAttention(c context.Context, owners []int64, mid int64) (isAtten map[int64]int8) {
if len(owners) == 0 || mid == 0 {
return
}
ip := metadata.String(c, metadata.RemoteIP)
arg := &account.ArgRelations{Owners: owners, Mid: mid, RealIP: ip}
res, err := d.accRPC.Relations3(c, arg)
if err != nil {
return
}
isAtten = make(map[int64]int8, len(res))
for mid, rel := range res {
if rel.Following {
isAtten[mid] = 1
}
}
return
}

View File

@@ -0,0 +1,44 @@
package account
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestRelations3(t *testing.T) {
Convey("get Relations3 all", t, func() {
res := d.Relations3(ctx(), []int64{1}, 1)
So(res, ShouldNotBeEmpty)
})
}
func TestCards3(t *testing.T) {
Convey("get Cards3 all", t, func() {
res, err := d.Cards3(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["activity_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["activity.go"],
importpath = "go-common/app/interface/main/app-channel/dao/activity",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model/activity:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,64 @@
package activity
import (
"context"
"net/url"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/model/activity"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_activitys = "/activity/pages"
)
// Dao is activity dao.
type Dao struct {
// http client
client *bm.Client
// activitys
activitys string
}
// New new a activity dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// http client
client: bm.NewClient(c.HTTPClient),
activitys: c.Host.Activity + _activitys,
}
return d
}
// Activitys activity or tpoci
func (d *Dao) Activitys(c context.Context, ids []int64) (actm map[int64]*activity.Activity, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("pids", xstr.JoinInts(ids))
params.Set("http", "2")
params.Set("platform", "pegasus")
var res struct {
Code int `json:"code"`
Data struct {
List []*activity.Activity `json:"list"`
} `json:"data"`
}
if err = d.client.Get(c, d.activitys, ip, params, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(ecode.Int(res.Code), d.activitys+"?"+params.Encode())
return
}
actm = make(map[int64]*activity.Activity, len(res.Data.List))
for _, act := range res.Data.List {
actm[act.ID] = act
}
return
}

View File

@@ -0,0 +1,37 @@
package activity
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestActivitys(t *testing.T) {
Convey("get Activitys all", t, func() {
res, err := d.Activitys(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["archive_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["archive.go"],
importpath = "go-common/app/interface/main/app-channel/dao/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/api/gorpc:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,64 @@
package archive
import (
"context"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/service/main/archive/api"
arcrpc "go-common/app/service/main/archive/api/gorpc"
"go-common/app/service/main/archive/model/archive"
"go-common/library/net/metadata"
"github.com/pkg/errors"
)
// Dao is archive dao.
type Dao struct {
// rpc
arcRPC *arcrpc.Service2
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// rpc
arcRPC: arcrpc.New2(c.ArchiveRPC),
}
return
}
// Archive get archive by aid.
func (d *Dao) Archive(ctx context.Context, aid int64) (a *api.Arc, err error) {
arg := &archive.ArgAid2{Aid: aid}
a, err = d.arcRPC.Archive3(ctx, arg)
return
}
// Archives multi get archives.
func (d *Dao) Archives(ctx context.Context, aids []int64) (as map[int64]*api.Arc, err error) {
arg := &archive.ArgAids2{Aids: aids}
as, err = d.arcRPC.Archives3(ctx, arg)
return
}
// ArchivesWithPlayer archives witch player
func (d *Dao) ArchivesWithPlayer(c context.Context, aids []int64, qn int, platform string, fnver, fnval, build int) (res map[int64]*archive.ArchiveWithPlayer, err error) {
if len(aids) == 0 {
return
}
ip := metadata.String(c, metadata.RemoteIP)
arg := &archive.ArgPlayer{Aids: aids, Qn: qn, Platform: platform, Fnval: fnval, Fnver: fnver, RealIP: ip, Build: build}
if res, err = d.arcRPC.ArchivesWithPlayer(c, arg); err != nil {
err = errors.Wrapf(err, "%v", arg)
}
return
}
// UpCount2 get upper count.
func (d *Dao) UpCount2(c context.Context, mid int64) (cnt int, err error) {
arg := &archive.ArgUpCount2{Mid: mid}
if cnt, err = d.arcRPC.UpCount2(c, arg); err != nil {
err = errors.Wrapf(err, "%v", arg)
}
return
}

View File

@@ -0,0 +1,59 @@
package archive
import (
"context"
"flag"
"os"
"testing"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-channel")
flag.Set("conf_token", "a920405f87c5bbcca15f3ffebf169c04")
flag.Set("tree_id", "7852")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/app-view-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func TestArchive(t *testing.T) {
Convey("Archive", t, func(ctx C) {
_, err := d.Archive(context.Background(), 99999999)
So(err, ShouldNotBeNil) // should 404
})
}
func TestArchives(t *testing.T) {
Convey("Archives", t, func(ctx C) {
_, err := d.Archives(context.Background(), []int64{1})
So(err, ShouldBeNil)
})
}
func TestArchivesWithPlayer(t *testing.T) {
Convey("ArchivesWithPlayer", t, func(ctx C) {
_, err := d.ArchivesWithPlayer(context.Background(), []int64{1}, 0, "", 0, 0, 0)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["article_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["article.go"],
importpath = "go-common/app/interface/main/app-channel/dao/article",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/openplatform/article/model:go_default_library",
"//app/interface/openplatform/article/rpc/client:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,36 @@
package article
import (
"context"
"go-common/app/interface/main/app-channel/conf"
article "go-common/app/interface/openplatform/article/model"
artrpc "go-common/app/interface/openplatform/article/rpc/client"
"go-common/library/net/metadata"
"github.com/pkg/errors"
)
// Dao is archive dao.
type Dao struct {
// rpc
artRPC *artrpc.Service
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// rpc
artRPC: artrpc.New(c.ArticleRPC),
}
return
}
func (d *Dao) Articles(c context.Context, aids []int64) (ms map[int64]*article.Meta, err error) {
ip := metadata.String(c, metadata.RemoteIP)
arg := &article.ArgAids{Aids: aids, RealIP: ip}
if ms, err = d.artRPC.ArticleMetas(c, arg); err != nil {
err = errors.Wrapf(err, "%v", aids)
}
return
}

View File

@@ -0,0 +1,37 @@
package article
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestArticles(t *testing.T) {
Convey("get Articles all", t, func() {
res, err := d.Articles(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["audio_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["audio.go"],
importpath = "go-common/app/interface/main/app-channel/dao/audio",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/audio:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,54 @@
package audio
import (
"context"
"net/url"
"go-common/app/interface/main/app-card/model/card/audio"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_getAudios = "/x/internal/v1/audio/menus/batch"
_songm = "/x/internal/v1/audio/songs/batch"
)
type Dao struct {
client *bm.Client
getAudios string
songm string
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: bm.NewClient(c.HTTPClient),
getAudios: c.Host.APICo + _getAudios,
songm: c.Host.APICo + _songm,
}
return
}
func (d *Dao) Audios(c context.Context, ids []int64) (aum map[int64]*audio.Audio, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("ids", xstr.JoinInts(ids))
var res struct {
Code int `json:"code"`
Data map[int64]*audio.Audio `json:"data"`
}
if err = d.client.Get(c, d.getAudios, ip, params, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(ecode.Int(res.Code), d.getAudios+"?"+params.Encode())
return
}
aum = res.Data
return
}

View File

@@ -0,0 +1,37 @@
package audio
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestGetAudios(t *testing.T) {
Convey("get GetAudios all", t, func() {
res, err := d.Audios(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = ["audit.go"],
importpath = "go-common/app/interface/main/app-channel/dao/audit",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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 = ["audit_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,63 @@
package audit
import (
"context"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_getSQL = "SELECT mobi_app,build FROM audit"
)
// Dao is audit dao.
type Dao struct {
db *sql.DB
}
// New new a audit dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Show),
}
return
}
// Audits get all audit build.
func (d *Dao) Audits(ctx context.Context) (res map[string]map[int]struct{}, err error) {
rows, err := d.db.Query(ctx, _getSQL)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
var (
mobiApp string
build int
)
res = map[string]map[int]struct{}{}
for rows.Next() {
if err = rows.Scan(&mobiApp, &build); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
if plat, ok := res[mobiApp]; ok {
plat[build] = struct{}{}
} else {
res[mobiApp] = map[int]struct{}{
build: struct{}{},
}
}
}
return
}
// Close close memcache resource.
func (dao *Dao) Close() {
if dao.db != nil {
dao.db.Close()
}
}

View File

@@ -0,0 +1,37 @@
package audit
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestGetAudios(t *testing.T) {
Convey("get GetAudios all", t, func() {
res, err := d.Audits(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,55 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["bangumi_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"bangumi.go",
"grpc.go",
],
importpath = "go-common/app/interface/main/app-channel/dao/bangumi",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/bangumi:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/episode/v1:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,74 @@
package bangumi
import (
"context"
"fmt"
"net/url"
"time"
"go-common/app/interface/main/app-card/model/card/bangumi"
"go-common/app/interface/main/app-channel/conf"
episodegrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_seasons = "/api/inner/aid_episodes_v2"
)
// Dao is bangumi dao.
type Dao struct {
// http client
client *bm.Client
// bangumi
seasons string
// grpc
rpcClient seasongrpc.SeasonClient
rpcEpidsClient episodegrpc.EpisodeClient
}
// New new a bangumi dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// http clients
client: bm.NewClient(c.HTTPClient),
seasons: c.Host.Bangumi + _seasons,
}
var err error
if d.rpcClient, err = seasongrpc.NewClient(c.PGCRPC); err != nil {
panic(fmt.Sprintf("seasongrpc NewClientt error (%+v)", err))
}
if d.rpcEpidsClient, err = episodegrpc.NewClient(c.PGCRPC); err != nil {
panic(fmt.Sprintf("episodegrpc NewClientt error (%+v)", err))
}
return d
}
// Seasons bangumi Season .
func (d *Dao) Seasons(c context.Context, aids []int64, now time.Time) (sm map[int64]*bangumi.Season, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("aids", xstr.JoinInts(aids))
params.Set("type", "av")
params.Set("build", "app-feed")
params.Set("platform", "Golang")
var res struct {
Code int `json:"code"`
Result map[int64]*bangumi.Season `json:"result"`
}
if err = d.client.Get(c, d.seasons, ip, params, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.seasons+"?"+params.Encode())
return
}
sm = res.Result
return
}

View File

@@ -0,0 +1,65 @@
package bangumi
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-channel")
flag.Set("conf_token", "a920405f87c5bbcca15f3ffebf169c04")
flag.Set("tree_id", "7852")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestSeasons(t *testing.T) {
Convey("get Seasons all", t, func() {
_, err := d.Seasons(ctx(), []int64{1}, time.Now())
err = nil
So(err, ShouldBeNil)
})
}
func TestCardsInfoReply(t *testing.T) {
Convey("get CardsInfoReply all", t, func() {
_, err := d.CardsInfoReply(ctx(), []int32{1})
err = nil
So(err, ShouldBeNil)
})
}
func TestEpidsCardsInfoReply(t *testing.T) {
Convey("get EpidsCardsInfoReply all", t, func() {
_, err := d.EpidsCardsInfoReply(ctx(), []int32{1})
err = nil
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,32 @@
package bangumi
import (
"context"
episodegrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"github.com/pkg/errors"
)
func (d *Dao) CardsInfoReply(c context.Context, seasonIds []int32) (res map[int32]*seasongrpc.CardInfoProto, err error) {
arg := &seasongrpc.SeasonInfoReq{SeasonIds: seasonIds}
info, err := d.rpcClient.Cards(c, arg)
if err != nil {
err = errors.Wrapf(err, "%v", arg)
return
}
res = info.Cards
return
}
func (d *Dao) EpidsCardsInfoReply(c context.Context, episodeIds []int32) (res map[int32]*episodegrpc.EpisodeCardsProto, err error) {
arg := &episodegrpc.EpReq{Epids: episodeIds}
info, err := d.rpcEpidsClient.Cards(c, arg)
if err != nil {
err = errors.Wrapf(err, "%v", arg)
return
}
res = info.Cards
return
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["card_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"cache.go",
"card.go",
],
importpath = "go-common/app/interface/main/app-channel/dao/card",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model/card:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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"],
)

View File

@@ -0,0 +1,53 @@
package card
import (
"context"
"fmt"
"time"
"go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_channelCardKey = "ccmd5_buvid_%v_%d"
)
func channelCardKey(buvid string, channelID int64) string {
return fmt.Sprintf(_channelCardKey, buvid, channelID)
}
// AddChannelCardCache add user buvid and cardID cache
func (d *Dao) AddChannelCardCache(c context.Context, buvid, md5 string, channelID int64, now time.Time) (err error) {
var (
key = channelCardKey(buvid, channelID)
conn = d.mc.Get(c)
currenttimeSec = int32((now.Hour() * 60 * 60) + (now.Minute() * 60) + now.Second())
overtime int32
)
if overtime = d.expire - currenttimeSec; overtime < 1 {
overtime = d.expire
}
if err = conn.Set(&memcache.Item{Key: key, Object: md5, Flags: memcache.FlagJSON, Expiration: overtime}); err != nil {
log.Error("AddChannelCardCache d.mc.Set(%s,%v) error(%v)", key, channelID, err)
}
conn.Close()
return
}
// ChannelCardCache user buvid channel card
func (d *Dao) ChannelCardCache(c context.Context, buvid string, channelID int64) (md5 string, err error) {
var (
key = channelCardKey(buvid, channelID)
conn = d.mc.Get(c)
r *memcache.Item
)
defer conn.Close()
if r, err = conn.Get(key); err != nil {
return
}
if err = conn.Scan(r, &md5); err != nil {
log.Error("r.Scan(%s) error(%v)", r.Value, err)
}
return
}

View File

@@ -0,0 +1,127 @@
package card
import (
"context"
"fmt"
"strconv"
"time"
"go-common/app/interface/main/app-card/model/card/operate"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/model/card"
"go-common/library/cache/memcache"
"go-common/library/database/sql"
)
const (
_cardSQL = `SELECT c.id,c.title,c.tag_id,c.card_type,c.card_value,c.recommand_reason,c.recommand_state,c.priority FROM channel_card AS c
WHERE c.stime<? AND c.etime>? AND c.check=2 AND c.is_delete=0 ORDER BY c.priority DESC`
_cardPlatSQL = `SELECT card_id,plat,conditions,build FROM channel_card_plat WHERE is_delete=0`
_followSQL = "SELECT `id`,`type`,`long_title`,`content` FROM `card_follow` WHERE `deleted`=0"
_cardSetSQL = `SELECT c.id,c.type,c.value,c.title,c.long_title,c.content FROM card_set AS c WHERE c.deleted=0`
)
// Dao is card dao.
type Dao struct {
db *sql.DB
// memcache
expire int32
mc *memcache.Pool
}
// New is card dao new.
func New(c *conf.Config) *Dao {
d := &Dao{
db: sql.NewMySQL(c.MySQL.Show),
// memcache
expire: int32(time.Duration(c.Memcache.Channels.Expire) / time.Second),
mc: memcache.NewPool(c.Memcache.Channels.Config),
}
return d
}
// Card channel card
func (d *Dao) Card(ctx context.Context, now time.Time) (res map[int64][]*card.Card, err error) {
res = map[int64][]*card.Card{}
rows, err := d.db.Query(ctx, _cardSQL, now, now)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
c := &card.Card{}
if err = rows.Scan(&c.ID, &c.Title, &c.ChannelID, &c.Type, &c.Value, &c.Reason, &c.ReasonType, &c.Pos); err != nil {
return
}
res[c.ChannelID] = append(res[c.ChannelID], c)
}
return
}
// CardPlat channel card plat
func (d *Dao) CardPlat(ctx context.Context) (res map[string][]*card.CardPlat, err error) {
res = map[string][]*card.CardPlat{}
var (
_initCardPlatKey = "card_platkey_%d_%d"
)
rows, err := d.db.Query(ctx, _cardPlatSQL)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
c := &card.CardPlat{}
if err = rows.Scan(&c.CardID, &c.Plat, &c.Condition, &c.Build); err != nil {
return
}
key := fmt.Sprintf(_initCardPlatKey, c.Plat, c.CardID)
res[key] = append(res[key], c)
}
return
}
// UpCard upper
func (d *Dao) UpCard(ctx context.Context) (res map[int64]*operate.Follow, err error) {
var rows *sql.Rows
if rows, err = d.db.Query(ctx, _followSQL); err != nil {
return
}
defer rows.Close()
res = make(map[int64]*operate.Follow)
for rows.Next() {
c := &operate.Follow{}
if err = rows.Scan(&c.ID, &c.Type, &c.Title, &c.Content); err != nil {
return
}
c.Change()
res[c.ID] = c
}
return
}
// CardSet card set
func (d *Dao) CardSet(ctx context.Context) (res map[int64]*operate.CardSet, err error) {
var rows *sql.Rows
if rows, err = d.db.Query(ctx, _cardSetSQL); err != nil {
return
}
defer rows.Close()
res = make(map[int64]*operate.CardSet)
for rows.Next() {
var (
c = &operate.CardSet{}
value string
)
if err = rows.Scan(&c.ID, &c.Type, &value, &c.Title, &c.LongTitle, &c.Content); err != nil {
return
}
c.Value, _ = strconv.ParseInt(value, 10, 64)
res[c.ID] = c
}
return
}
// PingDB ping db
func (d *Dao) PingDB(c context.Context) (err error) {
return d.db.Ping(c)
}

View File

@@ -0,0 +1,103 @@
package card
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-channel")
flag.Set("conf_token", "a920405f87c5bbcca15f3ffebf169c04")
flag.Set("tree_id", "7852")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestCardPlat(t *testing.T) {
Convey("get CardPlat all", t, func() {
_, err := d.CardPlat(ctx())
err = nil
So(err, ShouldBeNil)
})
}
func TestCard(t *testing.T) {
Convey("get Card all", t, func() {
_, err := d.Card(ctx(), time.Now())
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestUpCard(t *testing.T) {
Convey("get UpCard all", t, func() {
_, err := d.UpCard(ctx())
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestCardSet(t *testing.T) {
Convey("get CardSet all", t, func() {
_, err := d.CardSet(ctx())
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestPingDB(t *testing.T) {
Convey("get PingDB all", t, func() {
err := d.PingDB(ctx())
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestAddChannelCardCache(t *testing.T) {
Convey("get AddChannelCardCache all", t, func() {
err := d.AddChannelCardCache(ctx(), "", "", 1, time.Now())
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestChannelCardCache(t *testing.T) {
Convey("get ChannelCardCache all", t, func() {
_, err := d.ChannelCardCache(ctx(), "", 1)
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["converge_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["converge.go"],
importpath = "go-common/app/interface/main/app-channel/dao/converge",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//library/database/sql: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"],
)

View File

@@ -0,0 +1,52 @@
package converge
import (
"context"
"go-common/app/interface/main/app-card/model/card/operate"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/database/sql"
)
const (
_getSQL = "SELECT id,re_type,re_value,title,cover,content FROM content_card"
)
type Dao struct {
db *sql.DB
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Manager),
}
return
}
func (d *Dao) Cards(c context.Context) (cm map[int64]*operate.Converge, err error) {
rows, err := d.db.Query(c, _getSQL)
if err != nil {
return
}
defer rows.Close()
cm = map[int64]*operate.Converge{}
for rows.Next() {
c := &operate.Converge{}
if err = rows.Scan(&c.ID, &c.ReType, &c.ReValue, &c.Title, &c.Cover, &c.Content); err != nil {
return
}
if c.Title == "" {
continue
}
c.Change()
cm[c.ID] = c
}
return
}
// Close close memcache resource.
func (dao *Dao) Close() {
if dao.db != nil {
dao.db.Close()
}
}

View File

@@ -0,0 +1,37 @@
package converge
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestCards(t *testing.T) {
Convey("get Cards all", t, func() {
res, err := d.Cards(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["game_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["game.go"],
importpath = "go-common/app/interface/main/app-channel/dao/game",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//library/database/sql: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"],
)

View File

@@ -0,0 +1,49 @@
package game
import (
"context"
"go-common/app/interface/main/app-card/model/card/operate"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/database/sql"
)
const (
_getSQL = "SELECT `id`,`title`,`desc`,`icon`,`cover`,`url_type`,`url_value`,`btn_txt`,`re_type`,`re_value`,`number`,`double_cover` FROM download_card"
)
type Dao struct {
db *sql.DB
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Manager),
}
return
}
func (d *Dao) DownLoad(c context.Context) (dm map[int64]*operate.Download, err error) {
rows, err := d.db.Query(c, _getSQL)
if err != nil {
return
}
defer rows.Close()
dm = map[int64]*operate.Download{}
for rows.Next() {
d := &operate.Download{}
if err = rows.Scan(&d.ID, &d.Title, &d.Desc, &d.Icon, &d.Cover, &d.URLType, &d.URLValue, &d.BtnTxt, &d.ReType, &d.ReValue, &d.Number, &d.DoubleCover); err != nil {
return
}
d.Change()
dm[d.ID] = d
}
return
}
// Close close memcache resource.
func (d *Dao) Close() {
if d.db != nil {
d.db.Close()
}
}

View File

@@ -0,0 +1,37 @@
package game
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestDownLoad(t *testing.T) {
Convey("get DownLoad all", t, func() {
res, err := d.DownLoad(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["live_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["live.go"],
importpath = "go-common/app/interface/main/app-channel/dao/live",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/live:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model/live:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,112 @@
package live
import (
"context"
"net/http"
"net/url"
"strconv"
cardlive "go-common/app/interface/main/app-card/model/card/live"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/model/live"
"go-common/library/ecode"
httpx "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_appMRoom = "/room/v1/Room/rooms_for_app_index"
_feedList = "/feed/v1/feed/getList"
_card = "/room/v1/RoomRecommend/getInfoByCardId"
)
// Dao is show dao.
type Dao struct {
// http client
client *httpx.Client
// live
appMRoom string
feedList string
card string
}
// New new a bangumi dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// http client
client: httpx.NewClient(c.HTTPClient),
appMRoom: c.Host.LiveAPI + _appMRoom,
feedList: c.Host.LiveAPI + _feedList,
card: c.Host.LiveAPI + _card,
}
return
}
func (d *Dao) AppMRoom(c context.Context, roomids []int64) (rs map[int64]*cardlive.Room, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("room_ids", xstr.JoinInts(roomids))
var res struct {
Code int `json:"code"`
Data []*cardlive.Room `json:"data"`
}
if err = d.client.Get(c, d.appMRoom, ip, params, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.appMRoom+"?"+params.Encode())
return
}
rs = make(map[int64]*cardlive.Room, len(res.Data))
for _, r := range res.Data {
rs[r.RoomID] = r
}
return
}
func (d *Dao) FeedList(c context.Context, mid int64, pn, ps int) (fs []*live.Feed, count int, err error) {
var req *http.Request
params := url.Values{}
params.Set("page", strconv.Itoa(pn))
params.Set("pagesize", strconv.Itoa(ps))
if req, err = d.client.NewRequest("GET", d.feedList, "", params); err != nil {
return
}
req.Header.Set("X-BiliLive-UID", strconv.FormatInt(mid, 10))
var res struct {
Code int `json:"code"`
Data struct {
Rooms []*live.Feed `json:"rooms"`
Count int `json:"count"`
} `json:"data"`
}
if err = d.client.Do(c, req, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.feedList+"?"+params.Encode())
return
}
fs = res.Data.Rooms
count = res.Data.Count
return
}
func (d *Dao) Card(c context.Context) (csm map[int64][]*cardlive.Card, err error) {
var res struct {
Code int `json:"code"`
Data map[int64][]*cardlive.Card `json:"data"`
}
if err = d.client.Get(c, d.card, "", nil, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.card)
return
}
csm = res.Data
return
}

View File

@@ -0,0 +1,53 @@
package live
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestAppMRoom(t *testing.T) {
Convey("get AppMRoom all", t, func() {
res, err := d.AppMRoom(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestFeedList(t *testing.T) {
Convey("get FeedList all", t, func() {
res, _, err := d.FeedList(ctx(), 1, 1, 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestCard(t *testing.T) {
Convey("get Card all", t, func() {
res, err := d.Card(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/main/app-channel/dao/location",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/service/main/location/model:go_default_library",
"//app/service/main/location/rpc/client:go_default_library",
"//library/log: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"],
)

View File

@@ -0,0 +1,40 @@
package location
import (
"context"
"strconv"
"go-common/app/interface/main/app-channel/conf"
locmdl "go-common/app/service/main/location/model"
locrpc "go-common/app/service/main/location/rpc/client"
"go-common/library/log"
)
// Dao is location dao.
type Dao struct {
// rpc
locRPC *locrpc.Service
}
// New new a location dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// rpc
locRPC: locrpc.New(c.LocationRPC),
}
return
}
func (d *Dao) AuthPIDs(c context.Context, pids, ipaddr string) (res map[string]*locmdl.Auth, err error) {
var auths map[int64]*locmdl.Auth
if auths, err = d.locRPC.AuthPIDs(c, &locmdl.ArgPids{Pids: pids, IP: ipaddr}); err != nil {
log.Error("%v", err)
return
}
res = make(map[string]*locmdl.Auth)
for pid, auth := range auths {
p := strconv.FormatInt(pid, 10)
res[p] = auth
}
return
}

View File

@@ -0,0 +1,36 @@
package location
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestAuthPIDs(t *testing.T) {
Convey("get AuthPIDs", t, func() {
_, err := d.AuthPIDs(ctx(), "417,1521", "127.0.0.0")
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["region_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["region.go"],
importpath = "go-common/app/interface/main/app-channel/dao/region",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model/channel:go_default_library",
"//library/database/sql: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"],
)

View File

@@ -0,0 +1,87 @@
package region
import (
"context"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/model/channel"
"go-common/library/database/sql"
)
const (
_allSQL2 = "SELECT r.id,r.rid,r.reid,r.name,r.logo,r.param,r.plat,r.area,r.uri,r.type,l.name FROM region_copy AS r, language AS l WHERE r.state=1 AND l.id=r.lang_id ORDER BY r.rank DESC"
_limitSQL = "SELECT l.id,l.rid,l.build,l.conditions FROM region_limit AS l,region_copy AS r WHERE l.rid=r.id"
_configSQL = "SELECT c.id,c.rid,c.is_rank FROM region_rank_config AS c,region_copy AS r WHERE c.rid=r.id"
)
type Dao struct {
db *sql.DB
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Show),
}
return
}
// AllList get all region.
func (d *Dao) AllList(ctx context.Context) (apps []*channel.Region, err error) {
rows, err := d.db.Query(ctx, _allSQL2)
if err != nil {
return
}
defer rows.Close()
apps = []*channel.Region{}
for rows.Next() {
a := &channel.Region{}
if err = rows.Scan(&a.ID, &a.RID, &a.ReID, &a.Name, &a.Logo, &a.Param, &a.Plat, &a.Area, &a.URI, &a.Type, &a.Language); err != nil {
return
}
apps = append(apps, a)
}
return
}
// Limit region limits
func (d *Dao) Limit(ctx context.Context) (limits map[int64][]*channel.RegionLimit, err error) {
rows, err := d.db.Query(ctx, _limitSQL)
if err != nil {
return
}
defer rows.Close()
limits = map[int64][]*channel.RegionLimit{}
for rows.Next() {
a := &channel.RegionLimit{}
if err = rows.Scan(&a.ID, &a.Rid, &a.Build, &a.Condition); err != nil {
return
}
limits[a.Rid] = append(limits[a.Rid], a)
}
return
}
// Config region configs
func (d *Dao) Config(ctx context.Context) (configs map[int64][]*channel.RegionConfig, err error) {
rows, err := d.db.Query(ctx, _configSQL)
if err != nil {
return
}
defer rows.Close()
configs = map[int64][]*channel.RegionConfig{}
for rows.Next() {
a := &channel.RegionConfig{}
if err = rows.Scan(&a.ID, &a.Rid, &a.ScenesID); err != nil {
return
}
configs[a.Rid] = append(configs[a.Rid], a)
}
return
}
// Close close memcache resource.
func (dao *Dao) Close() {
if dao.db != nil {
dao.db.Close()
}
}

View File

@@ -0,0 +1,53 @@
package region
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestAllList(t *testing.T) {
Convey("get AllList all", t, func() {
res, err := d.AllList(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestLimit(t *testing.T) {
Convey("get Limit all", t, func() {
res, err := d.Limit(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestConfig(t *testing.T) {
Convey("get Config all", t, func() {
res, err := d.Config(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["relation_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["relation.go"],
importpath = "go-common/app/interface/main/app-channel/dao/relation",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//app/service/main/relation/rpc/client:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,35 @@
package relation
import (
"context"
"go-common/app/interface/main/app-channel/conf"
relation "go-common/app/service/main/relation/model"
relrpc "go-common/app/service/main/relation/rpc/client"
"github.com/pkg/errors"
)
// Dao is rpc dao.
type Dao struct {
// relation rpc
relRPC *relrpc.Service
}
// New new a relation dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// relation rpc
relRPC: relrpc.New(c.RelationRPC),
}
return
}
// Stats fids stats
func (d *Dao) Stats(ctx context.Context, mids []int64) (res map[int64]*relation.Stat, err error) {
arg := &relation.ArgMids{Mids: mids}
if res, err = d.relRPC.Stats(ctx, arg); err != nil {
err = errors.Wrapf(err, "%v", arg)
}
return
}

View File

@@ -0,0 +1,37 @@
package relation
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestStats(t *testing.T) {
Convey("get Stats all", t, func() {
res, err := d.Stats(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["shopping_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["shopping.go"],
importpath = "go-common/app/interface/main/app-channel/dao/shopping",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/show:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)

View File

@@ -0,0 +1,61 @@
package shopping
import (
"context"
"net/url"
"go-common/app/interface/main/app-card/model/card/show"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_getCard = "/api/ticket/project/getcard"
)
// Dao is shopping dao.
type Dao struct {
// http client
client *bm.Client
// live
getCard string
}
// New new a shopping dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// http client
client: bm.NewClient(c.HTTPShopping),
getCard: c.Host.Shopping + _getCard,
}
return d
}
func (d *Dao) Card(c context.Context, ids []int64) (rs map[int64]*show.Shopping, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("id", xstr.JoinInts(ids))
params.Set("for", "1")
params.Set("price", "1")
var res struct {
Code int `json:"errno"`
Data []*show.Shopping `json:"data"`
}
if err = d.client.Get(c, d.getCard, ip, params, &res); err != nil {
return
}
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.getCard+"?"+params.Encode())
return
}
rs = make(map[int64]*show.Shopping, len(res.Data))
for _, r := range res.Data {
rs[r.ID] = r
}
return
}

View File

@@ -0,0 +1,37 @@
package shopping
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestCard(t *testing.T) {
Convey("get Card all", t, func() {
res, err := d.Card(ctx(), []int64{1})
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["special_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["special.go"],
importpath = "go-common/app/interface/main/app-channel/dao/special",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-channel/conf:go_default_library",
"//library/database/sql: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"],
)

View File

@@ -0,0 +1,56 @@
package special
import (
"context"
"go-common/app/interface/main/app-card/model/card/operate"
"go-common/app/interface/main/app-channel/conf"
"go-common/library/database/sql"
)
const (
_getSQL = "SELECT `id`,`title`,`desc`,`cover`,`scover`,`re_type`,`re_value`,`corner`,`size`,`card` FROM special_card"
)
type Dao struct {
db *sql.DB
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Manager),
}
return
}
func (d *Dao) Card(c context.Context) (scm map[int64]*operate.Special, err error) {
rows, err := d.db.Query(c, _getSQL)
if err != nil {
return
}
defer rows.Close()
scm = map[int64]*operate.Special{}
for rows.Next() {
sc := &operate.Special{}
var cardType int
if err = rows.Scan(&sc.ID, &sc.Title, &sc.Desc, &sc.Cover, &sc.SingleCover, &sc.ReType, &sc.ReValue, &sc.Badge, &sc.Size, &cardType); err != nil {
return
}
sc.Change()
switch cardType {
case 3:
if sc.Desc == "" {
sc.Desc = "立即查看"
}
}
scm[sc.ID] = sc
}
return scm, err
}
// Close close memcache resource.
func (d *Dao) Close() {
if d.db != nil {
d.db.Close()
}
}

View File

@@ -0,0 +1,37 @@
package special
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-channel-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestCard(t *testing.T) {
Convey("get Card all", t, func() {
res, err := d.Card(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = ["tab.go"],
importpath = "go-common/app/interface/main/app-channel/dao/tab",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model/tab:go_default_library",
"//library/database/sql: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 = ["tab_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,47 @@
package tab
import (
"context"
"time"
"go-common/app/interface/main/app-channel/conf"
"go-common/app/interface/main/app-channel/model/tab"
"go-common/library/database/sql"
)
const (
_getAllMenuSQL = `SELECT ct.id,ct.tag_id,ct.tab_id,ct.title,ct.priority,a.name from channel_tab AS ct,app_active AS a
WHERE ct.stime<? AND ct.etime>? AND ct.is_delete=0 AND a.id=ct.tab_id ORDER BY ct.priority ASC`
)
type Dao struct {
db *sql.DB
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Show),
}
return
}
// Menus menus tab
func (d *Dao) Menus(c context.Context, now time.Time) (menus map[int64][]*tab.Menu, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, _getAllMenuSQL, now.Unix(), now.Unix()); err != nil {
return
}
defer rows.Close()
menus = map[int64][]*tab.Menu{}
for rows.Next() {
m := &tab.Menu{}
if err = rows.Scan(&m.ID, &m.TagID, &m.TabID, &m.Name, &m.Priority, &m.Title); err != nil {
return
}
menus[m.TagID] = append(menus[m.TagID], m)
}
err = rows.Err()
return
}

View File

@@ -0,0 +1,49 @@
package tab
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-channel")
flag.Set("conf_token", "a920405f87c5bbcca15f3ffebf169c04")
flag.Set("tree_id", "7852")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestMenus(t *testing.T) {
Convey("get Menus all", t, func() {
_, err := d.Menus(ctx(), time.Now())
err = nil
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["tag_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["tag.go"],
importpath = "go-common/app/interface/main/app-channel/dao/tag",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/tag/model:go_default_library",
"//app/interface/main/tag/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster: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"],
)

View File

@@ -0,0 +1,162 @@
package tag
import (
"context"
"time"
"go-common/app/interface/main/app-channel/conf"
tag "go-common/app/interface/main/tag/model"
tagrpc "go-common/app/interface/main/tag/rpc/client"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
// Dao tag
type Dao struct {
c *conf.Config
client *bm.Client
tagRPC *tagrpc.Service
}
//New tag
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
client: bm.NewClient(conf.Conf.HTTPClient),
tagRPC: tagrpc.New2(c.TagRPC),
}
return
}
// InfoByID by tag id
func (d *Dao) InfoByID(c context.Context, mid, tid int64) (t *tag.Tag, err error) {
arg := &tag.ArgID{ID: tid, Mid: mid}
t, err = d.tagRPC.InfoByID(c, arg)
return
}
// InfoByName by tag name
func (d *Dao) InfoByName(c context.Context, mid int64, tname string) (t *tag.Tag, err error) {
arg := &tag.ArgName{Name: tname, Mid: mid}
t, err = d.tagRPC.InfoByName(c, arg)
return
}
// ChannelDetail channel info by id or nane
func (d *Dao) ChannelDetail(c context.Context, mid, tid int64, tname string, isOversea int32) (t *tag.ChannelDetail, err error) {
arg := &tag.ReqChannelDetail{Mid: mid, Tid: tid, TName: tname, From: isOversea}
t, err = d.tagRPC.ChannelDetail(c, arg)
return
}
// InfoByIDs by tids
func (d *Dao) InfoByIDs(c context.Context, mid int64, tids []int64) (tm map[int64]*tag.Tag, err error) {
var ts []*tag.Tag
arg := &tag.ArgIDs{IDs: tids, Mid: mid}
if ts, err = d.tagRPC.InfoByIDs(c, arg); err != nil {
if err == ecode.NothingFound {
err = nil
return
}
return
}
tm = make(map[int64]*tag.Tag, len(ts))
for _, t := range ts {
tm[t.ID] = t
}
return
}
// Resources channel resources aids
func (d *Dao) Resources(c context.Context, plat int8, id, mid int64, name, buvid string, build, requestCnt, loginEvent, displayID int) (res *tag.ChannelResource, err error) {
arg := &tag.ArgChannelResource{
Tid: id,
Mid: mid,
Plat: int32(plat),
Build: int32(build),
LoginEvent: int32(loginEvent),
RequestCNT: int32(requestCnt),
DisplayID: int32(displayID),
Type: 3,
Name: name,
Buvid: buvid,
From: 0,
}
if res, err = d.tagRPC.ChannelResources(c, arg); err != nil {
return
}
return
}
// SubscribeUpdate subscribe update
func (d *Dao) SubscribeUpdate(c context.Context, mid int64, tids string) (err error) {
arg := &tag.ArgUpdateCustomSort{Tids: tids, Mid: mid, Type: 1}
err = d.tagRPC.UpdateCustomSortTags(c, arg)
return
}
// SubscribeAdd subscribe add
func (d *Dao) SubscribeAdd(c context.Context, mid, tagID int64, now time.Time) (err error) {
arg := &tag.ArgAddSub{Tids: []int64{tagID}, Mid: mid, Now: now}
err = d.tagRPC.AddSub(c, arg)
return
}
// SubscribeCancel subscribe add
func (d *Dao) SubscribeCancel(c context.Context, mid, tagID int64, now time.Time) (err error) {
arg := &tag.ArgCancelSub{Tid: tagID, Mid: mid, Now: now}
err = d.tagRPC.CancelSub(c, arg)
return
}
// Recommend func
func (d *Dao) Recommend(c context.Context, mid int64, isOversea int32) (rec []*tag.Channel, err error) {
arg := &tag.ArgRecommandChannel{Mid: mid, From: isOversea}
rec, err = d.tagRPC.RecommandChannel(c, arg)
return
}
// ListByCategory 分类下的频道
func (d *Dao) ListByCategory(c context.Context, id, mid int64, isOversea int32) (list []*tag.Channel, err error) {
arg := &tag.ArgChanneList{ID: id, Mid: mid, From: isOversea}
list, err = d.tagRPC.ChanneList(c, arg)
return
}
// Subscribe 已订阅频道
func (d *Dao) Subscribe(c context.Context, mid int64) (customSort *tag.CustomSortChannel, err error) {
arg := &tag.ArgCustomSort{Type: 1, Mid: mid, Pn: 1, Ps: 400, Order: -1}
customSort, err = d.tagRPC.CustomSortChannel(c, arg)
return
}
//Discover 频道tab页的3个发现频道
func (d *Dao) Discover(c context.Context, mid int64, isOversea int32) (discover []*tag.Channel, err error) {
arg := &tag.ArgDiscoverChanneList{Mid: mid, From: isOversea}
discover, err = d.tagRPC.DiscoverChannel(c, arg)
return
}
//Category channel category
func (d *Dao) Category(c context.Context, isOversea int32) (category []*tag.ChannelCategory, err error) {
category, err = d.tagRPC.ChannelCategories(c, &tag.ArgChannelCategories{From: isOversea})
return
}
//Square 频道广场页推荐频道+稿件
func (d *Dao) Square(c context.Context, mid int64, tagNum, oidNum, build int, loginEvent int32, plat int8, buvid string, isOversea int32) (square *tag.ChannelSquare, err error) {
arg := &tag.ReqChannelSquare{
Mid: mid,
TagNumber: int32(tagNum),
OidNumber: int32(oidNum),
Type: 3,
Buvid: buvid,
Build: int32(build),
Plat: int32(plat),
LoginEvent: loginEvent,
DisplayID: 1,
From: isOversea,
}
square, err = d.tagRPC.ChannelSquare(c, arg)
return
}

View File

@@ -0,0 +1,175 @@
package tag
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-channel/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-channel")
flag.Set("conf_token", "a920405f87c5bbcca15f3ffebf169c04")
flag.Set("tree_id", "7852")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestSubscribeUpdate(t *testing.T) {
Convey("get SubscribeUpdate all", t, func() {
err := d.SubscribeUpdate(ctx(), 1, "")
err = nil
So(err, ShouldBeNil)
})
}
func TestSubscribeAdd(t *testing.T) {
Convey("get SubscribeAdd all", t, func() {
err := d.SubscribeAdd(ctx(), 1, 1, time.Now())
err = nil
So(err, ShouldBeNil)
})
}
func TestSubscribeCancel(t *testing.T) {
Convey("get SubscribeCancel all", t, func() {
err := d.SubscribeCancel(ctx(), 1, 1, time.Now())
err = nil
So(err, ShouldBeNil)
})
}
func TestRecommend(t *testing.T) {
Convey("get Recommend all", t, func() {
_, err := d.Recommend(ctx(), 1, 1)
err = nil
// res = []*tag.Channel{}
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestListByCategory(t *testing.T) {
Convey("get ListByCategory all", t, func() {
_, err := d.ListByCategory(ctx(), 1, 1, 1)
err = nil
// res = []*tag.Channel{}
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestSubscribe(t *testing.T) {
Convey("get Subscribe all", t, func() {
_, err := d.Subscribe(ctx(), 1)
// res = &tag.CustomSortChannel{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestDiscover(t *testing.T) {
Convey("get Discover all", t, func() {
_, err := d.Discover(ctx(), 1, 1)
// res = []*tag.Channel{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestCategory(t *testing.T) {
Convey("get Category all", t, func() {
_, err := d.Category(ctx(), 1)
// res = []*tag.ChannelCategory{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestInfoByID(t *testing.T) {
Convey("get Category all", t, func() {
_, err := d.InfoByID(ctx(), 1, 1)
// res = &tag.Tag{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestInfoByName(t *testing.T) {
Convey("get Category all", t, func() {
_, err := d.InfoByName(ctx(), 1, "1")
// res = &tag.Tag{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestChannelDetail(t *testing.T) {
Convey("get ChannelDetail all", t, func() {
_, err := d.ChannelDetail(ctx(), 1, 1, "1", 1)
// res = &tag.ChannelDetail{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestInfoByIDs(t *testing.T) {
Convey("get InfoByIDs all", t, func() {
_, err := d.InfoByIDs(ctx(), 1, []int64{1})
// res = map[int64]*tag.Tag{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestResources(t *testing.T) {
Convey("get Resources all", t, func() {
_, err := d.Resources(ctx(), 1, 1, 1, "", "", 1, 1, 1, 1)
// res = &tag.ChannelResource{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestSquare(t *testing.T) {
Convey("get Square all", t, func() {
_, err := d.Square(ctx(), 1, 1, 1, 1, 1, 1, "", 1)
// res = &tag.ChannelSquare{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"channel.go",
"http.go",
"local.go",
],
importpath = "go-common/app/interface/main/app-channel/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/conf:go_default_library",
"//app/interface/main/app-channel/model:go_default_library",
"//app/interface/main/app-channel/model/channel:go_default_library",
"//app/interface/main/app-channel/service/channel:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/proxy:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/metadata: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"],
)

View File

@@ -0,0 +1,337 @@
package http
import (
"strconv"
"time"
"go-common/app/interface/main/app-channel/model"
"go-common/app/interface/main/app-channel/model/channel"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
const (
_headerBuvid = "Buvid"
)
func index(c *bm.Context) {
var (
params = c.Request.Form
mid int64
cidInt int64
header = c.Request.Header
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
idxStr := params.Get("idx")
pullStr := params.Get("pull")
loginEventStr := params.Get("login_event")
cidStr := params.Get("channel_id")
displayIDStr := params.Get("display_id")
cname := params.Get("channel_name")
qn, _ := strconv.Atoi(params.Get("qn"))
fnver, _ := strconv.Atoi(params.Get("fnver"))
fnval, _ := strconv.Atoi(params.Get("fnval"))
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
displayID, err := strconv.Atoi(displayIDStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
buvid := header.Get(_headerBuvid)
// disid := header.Get(_headerDisplayID)
pull, err := strconv.ParseBool(pullStr)
if err != nil {
pull = true
}
loginEvent, err := strconv.Atoi(loginEventStr)
if err != nil {
loginEvent = 0
}
idx, err := strconv.ParseInt(idxStr, 10, 64)
if err != nil || idx < 0 {
idx = 0
}
if cidInt, _ = strconv.ParseInt(cidStr, 10, 64); cidInt == 0 && cname == "" {
c.JSON(nil, ecode.RequestErr)
return
}
now := time.Now()
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
data, err := channelSvc.Index(c, mid, cidInt, idx, plat, mobiApp, device, buvid, cname, build, loginEvent, displayID, qn, fnver, fnval, pull, now)
c.JSON(data, err)
}
func index2(c *bm.Context) {
var (
params = c.Request.Form
mid int64
cidInt int64
header = c.Request.Header
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
idxStr := params.Get("idx")
pullStr := params.Get("pull")
loginEventStr := params.Get("login_event")
cidStr := params.Get("channel_id")
displayIDStr := params.Get("display_id")
cname := params.Get("channel_name")
qn, _ := strconv.Atoi(params.Get("qn"))
fnver, _ := strconv.Atoi(params.Get("fnver"))
fnval, _ := strconv.Atoi(params.Get("fnval"))
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
displayID, err := strconv.Atoi(displayIDStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
buvid := header.Get(_headerBuvid)
// disid := header.Get(_headerDisplayID)
pull, err := strconv.ParseBool(pullStr)
if err != nil {
pull = true
}
loginEvent, err := strconv.Atoi(loginEventStr)
if err != nil {
loginEvent = 0
}
idx, err := strconv.ParseInt(idxStr, 10, 64)
if err != nil || idx < 0 {
idx = 0
}
if cidInt, _ = strconv.ParseInt(cidStr, 10, 64); cidInt == 0 && cname == "" {
c.JSON(nil, ecode.RequestErr)
return
}
now := time.Now()
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
data, err := channelSvc.Index2(c, mid, cidInt, idx, plat, mobiApp, device, buvid, cname, metadata.String(c, metadata.RemoteIP), build, loginEvent, displayID, qn, fnver, fnval, pull, now)
c.JSON(data, err)
}
func tab(c *bm.Context) {
var (
params = c.Request.Form
mid int64
cidInt int64
)
cidStr := params.Get("channel_id")
cname := params.Get("channel_name")
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
if cidInt, _ = strconv.ParseInt(cidStr, 10, 64); cidInt == 0 && cname == "" {
c.JSON(nil, ecode.RequestErr)
return
}
mobiApp := params.Get("mobi_app")
device := params.Get("device")
plat := model.Plat(mobiApp, device)
c.JSON(channelSvc.Tab(c, cidInt, mid, cname, plat))
}
func subscribeAdd(c *bm.Context) {
var (
params = c.Request.Form
mid int64
cidInt int64
err error
fromInt int
now = time.Now()
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
cidStr := params.Get("channel_id")
fromStr := params.Get("from")
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
if cidInt, err = strconv.ParseInt(cidStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
fromInt, _ = strconv.Atoi(fromStr)
c.JSON(nil, channelSvc.SubscribeAdd(c, mid, cidInt, now))
channelSvc.OperationInfoc(mobiApp, device, "add", build, fromInt, cidInt, mid, now)
}
func subscribeCancel(c *bm.Context) {
var (
params = c.Request.Form
mid int64
cidInt int64
err error
fromInt int
now = time.Now()
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
cidStr := params.Get("channel_id")
fromStr := params.Get("from")
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
if cidInt, err = strconv.ParseInt(cidStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
fromInt, _ = strconv.Atoi(fromStr)
c.JSON(nil, channelSvc.SubscribeCancel(c, mid, cidInt, now))
channelSvc.OperationInfoc(mobiApp, device, "cannel", build, fromInt, cidInt, mid, now)
}
func subscribeUpdate(c *bm.Context) {
var (
params = c.Request.Form
mid int64
)
cidStr := params.Get("channel_ids")
if cidStr == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
c.JSON(nil, channelSvc.SubscribeUpdate(c, mid, cidStr))
}
func list(c *bm.Context) {
param := &channel.Param{}
if err := c.Bind(param); err != nil {
return
}
if midInter, ok := c.Get("mid"); ok {
param.MID = midInter.(int64)
}
plat := model.Plat(param.MobiApp, param.Device)
limit := 18 //频道聚合页需要展示最多18个我的订阅
c.JSON(channelSvc.List(c, param.MID, plat, param.Build, limit, param.Ver, param.MobiApp, param.Device, param.Lang))
}
func subscribe(c *bm.Context) {
param := &channel.Param{}
if err := c.Bind(param); err != nil {
return
}
if midInter, ok := c.Get("mid"); ok {
param.MID = midInter.(int64)
}
c.JSON(channelSvc.Subscribe(c, param.MID, 0))
}
func discover(c *bm.Context) {
param := &channel.Param{}
if err := c.Bind(param); err != nil {
return
}
if midInter, ok := c.Get("mid"); ok {
param.MID = midInter.(int64)
}
plat := model.Plat(param.MobiApp, param.Device)
c.JSON(channelSvc.Discover(c, param.ID, param.MID, plat))
}
func category(c *bm.Context) {
param := &channel.Param{}
if err := c.Bind(param); err != nil {
return
}
plat := model.Plat(param.MobiApp, param.Device)
c.JSON(channelSvc.Category(c, plat))
}
func square(c *bm.Context) {
param := &channel.ParamSquare{}
if err := c.Bind(param); err != nil {
return
}
if midInter, ok := c.Get("mid"); ok {
param.MID = midInter.(int64)
}
buvid := c.Request.Header.Get(_headerBuvid)
plat := model.Plat(param.MobiApp, param.Device)
c.JSON(channelSvc.Square(c, param.MID, plat, param.Build, param.LoginEvent, param.MobiApp, param.Device, param.Lang, buvid))
}
func mysub(c *bm.Context) {
param := &channel.Param{}
if err := c.Bind(param); err != nil {
return
}
if midInter, ok := c.Get("mid"); ok {
param.MID = midInter.(int64)
}
c.JSON(channelSvc.Mysub(c, param.MID, 0))
}
func tablist(c *bm.Context) {
var (
params = c.Request.Form
mid int64
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
cidStr := params.Get("channel_id")
displayIDStr := params.Get("display_id")
cname := params.Get("channel_name")
fromStr := params.Get("display_id")
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
displayID, err := strconv.Atoi(displayIDStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
cidInt, _ := strconv.ParseInt(cidStr, 10, 64)
if cidInt == 0 && cname == "" {
c.JSON(nil, ecode.RequestErr)
return
}
fromInt, err := strconv.Atoi(fromStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
now := time.Now()
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
data, err := channelSvc.TabList(c, cidInt, mid, cname, mobiApp, displayID, build, fromInt, plat, now)
c.JSON(data, err)
}

View File

@@ -0,0 +1,62 @@
package http
import (
"go-common/app/interface/main/app-channel/conf"
channelSvr "go-common/app/interface/main/app-channel/service/channel"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/middleware/proxy"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
// depend service
channelSvc *channelSvr.Service
verifySvc *verify.Verify
authSvc *auth.Auth
)
func Init(c *conf.Config) {
initService(c)
// init external router
engineOut := bm.DefaultServer(c.BM.Outer)
outerRouter(engineOut)
// init Outer server
if err := engineOut.Start(); err != nil {
log.Error("engineOut.Start() error(%v) | config(%v)", err, c)
panic(err)
}
}
// initService init services.
func initService(c *conf.Config) {
channelSvc = channelSvr.New(c)
verifySvc = verify.New(nil)
authSvc = auth.New(nil)
}
// outerRouter init outer router api path.
func outerRouter(e *bm.Engine) {
e.Ping(ping)
proxyHandler := proxy.NewZoneProxy("sh004", "http://sh001-app.bilibili.com")
cl := e.Group("/x/channel", verifySvc.Verify)
{
feed := cl.Group("/feed", authSvc.GuestMobile)
{
feed.GET("", index)
feed.GET("/index", proxyHandler, index2)
feed.GET("/tab", tab)
feed.GET("/tab/list", tablist)
}
cl.POST("/add", authSvc.UserMobile, subscribeAdd)
cl.POST("/cancel", authSvc.UserMobile, subscribeCancel)
cl.POST("/update", authSvc.UserMobile, subscribeUpdate)
cl.GET("/list", authSvc.GuestMobile, list)
cl.GET("/subscribe", authSvc.UserMobile, subscribe)
cl.GET("/discover", authSvc.GuestMobile, discover)
cl.GET("/category", authSvc.GuestMobile, category)
cl.GET("/square", authSvc.GuestMobile, square)
cl.GET("/mysub", authSvc.UserMobile, mysub)
}
}

View File

@@ -0,0 +1,17 @@
package http
import (
"net/http"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// ping check server ok.
func ping(c *bm.Context) {
var err error
if err = channelSvc.Ping(c); err != nil {
log.Error("app-channel service ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["const.go"],
importpath = "go-common/app/interface/main/app-channel/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/live:go_default_library",
"//app/interface/main/app-channel/model/tab:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-channel/model/activity:all-srcs",
"//app/interface/main/app-channel/model/audio:all-srcs",
"//app/interface/main/app-channel/model/bangumi:all-srcs",
"//app/interface/main/app-channel/model/card:all-srcs",
"//app/interface/main/app-channel/model/channel:all-srcs",
"//app/interface/main/app-channel/model/converge:all-srcs",
"//app/interface/main/app-channel/model/dislike:all-srcs",
"//app/interface/main/app-channel/model/feed:all-srcs",
"//app/interface/main/app-channel/model/game:all-srcs",
"//app/interface/main/app-channel/model/live:all-srcs",
"//app/interface/main/app-channel/model/recommend:all-srcs",
"//app/interface/main/app-channel/model/shopping:all-srcs",
"//app/interface/main/app-channel/model/special:all-srcs",
"//app/interface/main/app-channel/model/tab:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["activity.go"],
importpath = "go-common/app/interface/main/app-channel/model/activity",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,11 @@
package activity
type Activity struct {
ID int64 `json:"id"`
Name string `json:"name"`
H5URL string `json:"h5_url"`
H5Cover string `json:"h5_cover"`
Desc string `json:"desc"`
STime string `json:"stime"`
ETime string `json:"etime"`
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["audio.go"],
importpath = "go-common/app/interface/main/app-channel/model/audio",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package audio
type Audio struct {
MenuID int64 `json:"menu_id,omitempty"`
Title string `json:"title,omitempty"`
CoverURL string `json:"cover_url,omitempty"`
PlayNum int `json:"play_num,omitempty"`
RecordNum int `json:"record_num,omitempty"`
FavoriteNum int `json:"favorite_num,omitempty"`
Author string `json:"author,omitempty"`
Face string `json:"face,omitempty"`
Songs []*struct {
Title string `json:"title,omitempty"`
} `json:"songs,omitempty"`
PaTime int64 `json:"pa_time,omitempty"`
Ctgs []*struct {
ItemID int64 `json:"item_id,omitempty"`
ItemVal string `json:"item_val,omitempty"`
} `json:"ctgs,omitempty"`
Type int `json:"type,omitempty"`
}
type Song struct {
SongID int64 `json:"song_id,omitempty"`
Title string `json:"title,omitempty"`
CoverURL string `json:"cover_url,omitempty"`
PlayNum int `json:"play_num,omitempty"`
ReplyNum int `json:"reply_num,omitempty"`
Ctgs []*struct {
ItemID int64 `json:"item_id,omitempty"`
ItemVal string `json:"item_val,omitempty"`
} `json:"ctgs,omitempty"`
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["bangumi.go"],
importpath = "go-common/app/interface/main/app-channel/model/bangumi",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,27 @@
package bangumi
type Season struct {
Aid int64 `json:"aid,omitempty"`
SeasonID int64 `json:"season_id,omitempty"`
SeasonStatus int8 `json:"season_status,omitempty"`
Title string `json:"title,omitempty"`
Index string `json:"index,omitempty"`
IndexTitle string `json:"index_title,omitempty"`
Cover string `json:"cover,omitempty"`
Badge string `json:"badge,omitempty"`
PlayCount int `json:"play_count,omitempty"`
Favorites int `json:"favorites,omitempty"`
SeasonType int8 `json:"season_type,omitempty"`
TypeBadge string `json:"type_badge,omitempty"`
IsFinish int8 `json:"is_finish,omitempty"`
TotalCount int `json:"total_count,omitempty"`
NewestEpIndex string `json:"newest_ep_index,omitempty"`
SeasonCover string `json:"season_cover,omitempty"`
UpdateDesc string `json:"update_desc,omitempty"`
}
type Update struct {
SquareCover string `json:"square_cover"`
Title string `json:"title"`
Updates int `json:"updates"`
}

View File

@@ -0,0 +1,34 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["card.go"],
importpath = "go-common/app/interface/main/app-channel/model/card",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/ai:go_default_library",
"//app/interface/main/app-channel/model:go_default_library",
"//app/interface/main/app-channel/model/recommend:go_default_library",
"//library/log: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"],
)

View File

@@ -0,0 +1,138 @@
package card
import (
"encoding/json"
"strconv"
"go-common/app/interface/main/app-card/model/card/ai"
"go-common/app/interface/main/app-channel/model"
"go-common/app/interface/main/app-channel/model/recommend"
"go-common/library/log"
)
type Card struct {
ID int64 `json:"-"`
Title string `json:"-"`
ChannelID int64 `json:"-"`
Type string `json:"-"`
Value int64 `json:"-"`
Reason string `json:"-"`
ReasonType int8 `json:"-"`
Pos int `json:"-"`
FromType string `json:"-"`
}
type CardPlat struct {
CardID int64 `json:"-"`
Plat int8 `json:"-"`
Condition string `json:"-"`
Build int `json:"-"`
}
type UpCard struct {
ID int64 `json:"id,omitempty"`
Type string `json:"type,omitempty"`
Title string `json:"title,omitempty"`
RcmdReason string `json:"rcmd_reason,omitempty"`
Content json.RawMessage `json:"content,omitempty"`
Data *recommend.Item `json:"data,omitempty"`
}
type UpContent struct {
CType string `json:"ctype,omitempty"`
CValue interface{} `json:"cvalue,omitempty"`
}
type ChannelSingle struct {
AID interface{} `json:"aid,omitempty"`
ChannelID interface{} `json:"channel_id,omitempty"`
}
func (c *UpCard) Change() {
data := []*UpContent{}
if err := json.Unmarshal(c.Content, &data); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", c.Content, err)
return
}
upItem := make([]*recommend.Item, 0, len(data))
for _, d := range data {
switch d.CType {
case "mid", "channel_id":
var (
value int64
err error
)
switch v := d.CValue.(type) {
case float64:
value = int64(v)
case string:
if value, err = strconv.ParseInt(v, 10, 64); err != nil {
continue
}
}
item := &recommend.Item{ID: value}
upItem = append(upItem, item)
}
}
if len(upItem) < 3 {
return
}
// TODO rcmd_reason
c.Data = &recommend.Item{Goto: model.GotoSubscribe, ID: c.ID, Config: &recommend.Config{Title: c.RcmdReason}, Items: upItem}
}
func (c *UpCard) ChannelSingleChange() {
data := &ChannelSingle{}
if err := json.Unmarshal(c.Content, &data); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", c.Content, err)
return
}
var (
aid, channelid int64
err error
)
switch v := data.AID.(type) {
case float64:
aid = int64(v)
case string:
if aid, err = strconv.ParseInt(v, 10, 64); err != nil {
return
}
}
switch v := data.ChannelID.(type) {
case float64:
channelid = int64(v)
case string:
if channelid, err = strconv.ParseInt(v, 10, 64); err != nil {
return
}
}
c.Data = &recommend.Item{Goto: model.GotoChannelRcmd, ID: aid, Config: &recommend.Config{Title: c.Title}, TagID: channelid}
}
func (c *Card) CardToAiChange() (a *ai.Item) {
a = &ai.Item{
Goto: c.Type,
ID: c.Value,
RcmdReason: c.fromRcmdReason(),
}
return
}
func (c *Card) fromRcmdReason() (a *ai.RcmdReason) {
var content string
switch c.ReasonType {
case 0:
content = ""
case 1:
content = "编辑精选"
case 2:
content = "热门推荐"
case 3:
content = c.Reason
}
if content != "" {
a = &ai.RcmdReason{ID: 1, Content: content, BgColor: "yellow", IconLocation: "left_top"}
}
return
}

View File

@@ -0,0 +1,34 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["channel.go"],
importpath = "go-common/app/interface/main/app-channel/model/channel",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card:go_default_library",
"//app/interface/main/app-channel/model:go_default_library",
"//app/interface/main/app-channel/model/tab:go_default_library",
"//app/interface/main/tag/model: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"],
)

View File

@@ -0,0 +1,167 @@
package channel
import (
"go-common/app/interface/main/app-card/model/card"
"go-common/app/interface/main/app-channel/model"
"go-common/app/interface/main/app-channel/model/tab"
tag "go-common/app/interface/main/tag/model"
"strconv"
)
// Tab is
type Tab struct {
ID int64 `json:"id"`
Name string `json:"name"`
IsAtten int32 `json:"is_atten,omitempty"`
Atten int64 `json:"atten,omitempty"`
Cover string `json:"cover,omitempty"`
HeadCover string `json:"head_cover,omitempty"`
Content string `json:"content,omitempty"`
URI string `json:"uri,omitempty"`
Activity int32 `json:"activity,omitempty"`
SimilarTag []*Tab `json:"similar_tag,omitempty"`
TabList []*TabList `json:"tab,omitempty"`
}
type TabList struct {
TabID string `json:"tab_id,omitempty"`
Name string `json:"name,omitempty"`
URI string `json:"uri,omitempty,"`
}
// Tag is
type Tag struct {
ID int64 `json:"tag_id,omitempty"`
Name string `json:"tag_name,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Count *struct {
Atten int `json:"atten,omitempty"`
} `json:"count,omitempty"`
}
// Param is
type Param struct {
MobiApp string `form:"mobi_app"`
Device string `form:"device"`
AccessKey string `form:"access_key"`
Build int `form:"build"`
Ver string `form:"ver"`
Lang string `form:"lang"`
ID int64 `form:"id"`
MID int64 `form:"mid"`
}
// List is
type List struct {
RegionTop []*Region `json:"region_top,omitempty"`
RegionBottom []*Region `json:"region_bottom,omitempty"`
AttenChannel []*Channel `json:"atten_channel,omitempty"`
RecChannel []*Channel `json:"rec_channel,omitempty"`
Ver string `json:"ver"`
}
// Region is
type Region struct {
ID int64 `json:"-"`
RID int `json:"tid"`
ReID int `json:"reid"`
Name string `json:"name"`
Logo string `json:"logo"`
GoTo string `json:"goto"`
Param string `json:"param"`
Type int8 `json:"type"`
URI string `json:"uri,omitempty"`
Area string `json:"-"`
Language string `json:"-"`
Plat int8 `json:"-"`
}
// Channel is
type Channel struct {
ID int64 `json:"id"`
Name string `json:"name"`
IsAtten int32 `json:"is_atten,omitempty"`
Cover string `json:"cover,omitempty"`
Atten int64 `json:"atten,omitempty"`
Content string `json:"content,omitempty"`
}
// Category is
type Category struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
// RegionLimit
type RegionLimit struct {
ID int64 `json:"-"`
Rid int64 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
}
// RegionConfig
type RegionConfig struct {
ID int64 `json:"-"`
Rid int64 `json:"-"`
ScenesID int `json:"-"`
}
// ParamSquare
type ParamSquare struct {
MobiApp string `form:"mobi_app"`
Device string `form:"device"`
AccessKey string `form:"access_key"`
Build int `form:"build"`
Lang string `form:"lang"`
MID int64 `form:"mid"`
LoginEvent int32 `form:"login_event"`
}
// Square
type Square struct {
Region []*Region `json:"region,omitempty"`
Square []card.Handler `json:"square,omitempty"`
}
// Mysub
type Mysub struct {
List []*Channel `json:"list,omitempty"`
DisplayCount int `json:"display_count,omitempty"`
}
type ChanOids struct {
Oid int64 `json:"-"`
FromType string `json:"-"`
}
func (t *Tab) SimilarTagChange(tc *tag.ChannelDetail) {
t.ID = tc.Tag.ID
t.Name = tc.Tag.Name
t.IsAtten = tc.Tag.Attention
t.Atten = tc.Tag.Sub
t.Content = tc.Tag.Content
t.Cover = tc.Tag.Cover
if t.Cover == "" {
t.Cover = "http://i0.hdslb.com/bfs/archive/33dc521a84fb608e07770b3fdc347104aa6e9911.png"
}
t.HeadCover = tc.Tag.HeadCover
if t.HeadCover == "" {
t.HeadCover = "http://i0.hdslb.com/bfs/archive/de02e2a2293a1da46ea9669679d88514959910ef.png"
}
t.Activity = tc.Tag.Activity
for _, s := range tc.Synonym {
ct := &Tab{
ID: s.Id,
Name: s.Name,
}
ct.URI = model.FillURI(model.GotoTag, strconv.FormatInt(s.Id, 10), 0, 0, 0, nil)
t.SimilarTag = append(t.SimilarTag, ct)
}
}
func (l *TabList) TabListChange(m *tab.Menu) {
l.TabID = strconv.FormatInt(m.TabID, 10)
l.Name = m.Name
l.URI = model.FillURI(model.GotoPegasusTab, strconv.FormatInt(m.TabID, 10), 0, 0, 0, model.PegasusHandler(m))
}

View File

@@ -0,0 +1,399 @@
package model
import (
"encoding/json"
"fmt"
"net/url"
"strings"
cardlive "go-common/app/interface/main/app-card/model/card/live"
"go-common/app/interface/main/app-channel/model/tab"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
)
const (
// PlatAndroid is int8 for android.
PlatAndroid = int8(0)
// PlatIPhone is int8 for iphone.
PlatIPhone = int8(1)
// PlatIPad is int8 for ipad.
PlatIPad = int8(2)
// PlatWPhone is int8 for wphone.
PlatWPhone = int8(3)
// PlatAndroidG is int8 for Android Global.
PlatAndroidG = int8(4)
// PlatIPhoneI is int8 for Iphone Global.
PlatIPhoneI = int8(5)
// PlatIPadI is int8 for IPAD Global.
PlatIPadI = int8(6)
// PlatAndroidTV is int8 for AndroidTV Global.
PlatAndroidTV = int8(7)
// PlatAndroidI is int8 for Android Global.
PlatAndroidI = int8(8)
GotoAv = "av"
GotoWeb = "web"
GotoBangumi = "bangumi"
GotoPGC = "pgc"
GotoLive = "live"
GotoGame = "game"
GotoTopic = "topic"
GotoActivity = "activity"
GotoAdAv = "ad_av"
GotoAdWeb = "ad_web"
GotoRank = "rank"
GotoTag = "tag"
GotoBangumiRcmd = "bangumi_rcmd"
GotoLogin = "login"
GotoUpBangumi = "up_bangumi"
GotoBanner = "banner"
GotoAdWebS = "ad_web_s"
GotoUpArticle = "up_article"
GotoGameDownload = "game_download"
GotoConverge = "converge"
GotoSpecial = "special"
GotoArticle = "article"
GotoArticleS = "article_s"
GotoGameDownloadS = "game_download_s"
GotoShoppingS = "shopping_s"
GotoAudio = "audio"
GotoPlayer = "player"
GotoAdLarge = "ad_large"
GotoSpecialS = "special_s"
GotoPlayerLive = "player_live"
GotoSong = "song"
GotoUpRcmdAv = "up_rcmd_av"
GotoSubscribe = "subscribe"
GotoLiveUpRcmd = "live_up_rcmd"
GotoTopstick = "topstick"
GotoChannelRcmd = "channel_rcmd"
GotoPgcsRcmd = "pgcs_rcmd"
GotoUpRcmdS = "up_rcmd_s"
GotoPegasusTab = "pegasus"
// audio tag
GotoAudioTag = "audio_tag"
// extra tab
GotoTabBackground = "background"
GotoTabEntrance = "entrance"
GotoTabContentRcmd = "content_rcmd"
GotoTabTagRcmd = "tag_rcmd"
GotoTabSignIn = "sign_in"
GotoTabNews = "news"
// EnvPro is pro.
EnvPro = "pro"
// EnvTest is env.
EnvTest = "test"
// EnvDev is env.
EnvDev = "dev"
)
var (
AvHandler = func(a *api.Arc) func(uri string) string {
return func(uri string) string {
if a == nil {
return uri
}
if a.Dimension.Height != 0 || a.Dimension.Width != 0 {
return fmt.Sprintf("%s?player_width=%d&player_height=%d&player_rotate=%d", uri, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
}
return uri
}
}
AvPlayHandler = func(a *archive.Archive3, ap *archive.PlayerInfo) func(uri string) string {
var player string
if ap != nil {
bs, _ := json.Marshal(ap)
player = url.QueryEscape(string(bs))
if strings.IndexByte(player, '+') > -1 {
player = strings.Replace(player, "+", "%20", -1)
}
}
return func(uri string) string {
if player != "" && (a.Dimension.Height != 0 || a.Dimension.Width != 0) {
return fmt.Sprintf("%s?page=1&player_preload=%s&player_width=%d&player_height=%d&player_rotate=%d", uri, player, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
} else if player != "" {
return fmt.Sprintf("%s?page=1&player_preload=%s", uri, player)
} else if a.Dimension.Height != 0 || a.Dimension.Width != 0 {
return fmt.Sprintf("%s?player_width=%d&player_height=%d&player_rotate=%d", uri, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
}
return uri
}
}
LiveUpHandler = func(l *cardlive.Card) func(uri string) string {
return func(uri string) string {
if l == nil {
return uri
}
return fmt.Sprintf("%s?broadcast_type=%d", uri, l.BroadcastType)
}
}
LiveRoomHandler = func(l *cardlive.Room) func(uri string) string {
return func(uri string) string {
if l == nil {
return uri
}
return fmt.Sprintf("%s?broadcast_type=%d", uri, l.BroadcastType)
}
}
PegasusHandler = func(m *tab.Menu) func(uri string) string {
return func(uri string) string {
if m == nil {
return uri
}
if m.Title != "" {
return fmt.Sprintf("%s?name=%s", uri, url.QueryEscape(m.Title))
}
return uri
}
}
)
// IsAndroid check plat is android or ipad.
func IsAndroid(plat int8) bool {
return plat == PlatAndroid || plat == PlatAndroidG
}
// IsIOS check plat is iphone or ipad.
func IsIOS(plat int8) bool {
return plat == PlatIPad || plat == PlatIPhone || plat == PlatIPadI || plat == PlatIPhoneI
}
// IsIPad check plat is pad.
func IsIPad(plat int8) bool {
return plat == PlatIPad || plat == PlatIPadI
}
// IsOverseas is overseas
func IsOverseas(plat int8) bool {
return plat == PlatAndroidI || plat == PlatIPhoneI || plat == PlatIPadI
}
func IsGoto(gt string) bool {
return gt == GotoAv || gt == GotoWeb || gt == GotoBangumi || gt == GotoLive || gt == GotoGame || gt == GotoTopic || gt == GotoActivity ||
gt == GotoAdAv || gt == GotoAdWeb || gt == GotoRank || gt == GotoTag || gt == GotoBangumiRcmd || gt == GotoLogin || gt == GotoUpBangumi ||
gt == GotoBanner || gt == GotoAdWebS || gt == GotoUpArticle || gt == GotoGameDownload || gt == GotoGameDownloadS || gt == GotoConverge ||
gt == GotoSpecial || gt == GotoArticle || gt == GotoArticleS || gt == GotoShoppingS || gt == GotoAudio || gt == GotoPlayer || gt == GotoAdLarge ||
gt == GotoSpecialS || gt == GotoPlayerLive || gt == GotoSong
}
// FillURI deal app schema.
func FillURI(gt, param string, typ int, plat int8, build int, f func(uri string) string) (uri string) {
if param == "" {
return
}
switch gt {
case GotoAv, GotoAdAv, "":
uri = "bilibili://video/" + param
case GotoLive:
uri = "bilibili://live/" + param
case GotoBangumi:
uri = "https://www.bilibili.com/bangumi/play/ep" + param
case GotoUpBangumi:
uri = "https://www.bilibili.com/bangumi/play/ss" + param
case GotoUpArticle, GotoArticle, GotoArticleS:
uri = "bilibili://article/" + param
case GotoGame:
uri = "bilibili://game_center/detail?id=" + param + "&sourceType=adPut"
case GotoAudio:
uri = "bilibili://music/menu/detail/" + param
case GotoSong:
uri = "bilibili://music/detail/" + param
case GotoSpecial, GotoGameDownload, GotoConverge, GotoGameDownloadS, GotoSpecialS, GotoTopstick:
switch typ {
case 11:
uri = "bilibili://clip/" + param
case 10:
uri = "bilibili://album/" + param
case 9:
uri = "bilibili://music/detail/" + param
case 8:
uri = "bilibili://music/menu/detail/" + param
case 7:
uri = "bilibili://pegasus/list/daily/" + param
case 6:
uri = "bilibili://article/" + param
case 5:
if param != "" {
uri = "bilibili://category/65541/" + param
} else {
uri = "bilibili://category/65541"
}
case 4:
uri = "bilibili://live/" + param
case 3:
uri = "https://www.bilibili.com/bangumi/play/ss" + param
case 2:
uri = "bilibili://video/" + param
case 1:
uri = "bilibili://game_center/detail?id=" + param + "&sourceType=adPut"
case 0:
uri = param
}
case GotoAudioTag:
uri = "bilibili://music/categorydetail/" + param
case GotoWeb, GotoActivity, GotoTopic, GotoAdWeb, GotoRank, GotoAdWebS, GotoShoppingS, GotoAdLarge:
uri = param
case GotoTag:
if param != "" {
uri = "bilibili://pegasus/channel/" + param
}
case GotoPegasusTab:
uri = "bilibili://pegasus/channel/op/" + param
}
if f != nil {
uri = f(uri)
}
return
}
// FillPlayerURI deal app schema.
func FillPlayerURI(gt string, id int64, player string) (uri string) {
switch gt {
case GotoAv:
player = url.QueryEscape(player)
if strings.IndexByte(player, '+') > -1 {
player = strings.Replace(player, "+", "%20", -1)
}
uri = fmt.Sprintf("bilibili://video/%d/?page=1&player_preload=%s", id, player)
}
return
}
func FillSongTagURI(id int64) (uri string) {
return fmt.Sprintf("bilibili://music/categorydetail/%d", id)
}
func FillRedirect(gt string, typ int) (redirect string) {
switch gt {
case GotoSpecial, GotoGameDownload, GotoConverge, GotoGameDownloadS, GotoSpecialS:
switch typ {
case 7:
redirect = "daily"
case 6:
redirect = "article"
case 5:
redirect = "category/65541"
case 4:
redirect = "live"
case 3:
redirect = ""
case 2:
redirect = "video"
case 1:
redirect = "game"
case 0:
redirect = ""
}
}
return
}
// CoverURL convert cover url to full url.
func CoverURL(uri string) (cover string) {
if uri == "" {
cover = "http://static.hdslb.com/images/transparent.gif"
return
}
if strings.HasPrefix(uri, "http://i0.hdslb.com") || strings.HasPrefix(uri, "http://i1.hdslb.com") || strings.HasPrefix(uri, "http://i2.hdslb.com") {
uri = uri[19:]
} else if strings.HasPrefix(uri, "https://i0.hdslb.com") || strings.HasPrefix(uri, "https://i1.hdslb.com") || strings.HasPrefix(uri, "https://i2.hdslb.com") {
uri = uri[20:]
}
cover = uri
if strings.HasPrefix(uri, "/bfs") {
cover = "http://i0.hdslb.com" + uri
return
}
if strings.Index(uri, "http://") == 0 {
return
}
if len(uri) >= 10 && uri[:10] == "/templets/" {
return
}
if strings.HasPrefix(uri, "group1") || strings.HasPrefix(uri, "/group1") {
cover = "http://i0.hdslb.com/" + uri
return
}
if pos := strings.Index(uri, "/uploads/"); pos != -1 && (pos == 0 || pos == 3) {
cover = uri[pos+8:]
}
cover = strings.Replace(cover, "{IMG}", "", -1)
cover = "http://i0.hdslb.com" + cover
return
}
func CoverURLHTTPS(uri string) (cover string) {
if strings.HasPrefix(uri, "http://") {
cover = "https://" + uri[7:]
} else {
cover = uri
}
return
}
// InvalidBuild check source build is not allow by config build and condition.
// eg: when condition is gt, means srcBuild must gt cfgBuild, otherwise is invalid srcBuild.
func InvalidBuild(srcBuild, cfgBuild int, cfgCond string) bool {
if cfgBuild != 0 && cfgCond != "" {
switch cfgCond {
case "gt":
if cfgBuild >= srcBuild {
return true
}
case "lt":
if cfgBuild <= srcBuild {
return true
}
case "eq":
if cfgBuild != srcBuild {
return true
}
case "ne":
if cfgBuild == srcBuild {
return true
}
}
}
return false
}
// InvalidChannel check source channel is not allow by config channel.
func InvalidChannel(plat int8, srcCh, cfgCh string) bool {
return plat == PlatAndroid && cfgCh != "*" && cfgCh != srcCh
}
// Plat return plat by platStr or mobiApp
func Plat(mobiApp, device string) int8 {
switch mobiApp {
case "iphone", "iphone_b":
if device == "pad" {
return PlatIPad
}
return PlatIPhone
case "white":
return PlatIPhone
case "ipad":
return PlatIPad
case "android", "android_b":
return PlatAndroid
case "win":
return PlatWPhone
case "android_G":
return PlatAndroidG
case "android_i":
return PlatAndroidI
case "iphone_i":
if device == "pad" {
return PlatIPadI
}
return PlatIPhoneI
case "ipad_i":
return PlatIPadI
case "android_tv":
return PlatAndroidTV
}
return PlatIPhone
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["converge.go"],
importpath = "go-common/app/interface/main/app-channel/model/converge",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-channel/model:go_default_library",
"//library/log: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"],
)

View File

@@ -0,0 +1,72 @@
package converge
import (
"encoding/json"
"go-common/library/log"
"strconv"
"go-common/app/interface/main/app-channel/model"
)
type Card struct {
ID int64
ReType int
ReValue string
Title string
Cover string
Content json.RawMessage
Contents []*Content
}
type JSONContent struct {
CType string `json:"ctype"`
CTitle string `json:"ctitle"`
CValue json.RawMessage `json:"cvalue"`
}
type Content struct {
Goto string `json:"goto,omitempty"`
ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
}
func (c *Card) Change() {
var (
contents []*Content
jsonContents []*JSONContent
err error
)
if err = json.Unmarshal(c.Content, &jsonContents); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", c.Content, err)
return
}
contents = make([]*Content, 0, len(jsonContents))
for _, js := range jsonContents {
switch js.CType {
case "0", "1", "2":
content := &Content{Title: js.CTitle}
if js.CType == "0" {
content.Goto = model.GotoAv
} else if js.CType == "1" {
content.Goto = model.GotoLive
} else if js.CType == "2" {
content.Goto = model.GotoArticle
} else {
continue
}
var (
idStr string
id int64
)
if err = json.Unmarshal(js.CValue, &idStr); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", js.CValue, err)
continue
}
if id, _ = strconv.ParseInt(idStr, 10, 64); id != 0 {
content.ID = id
contents = append(contents, content)
}
}
}
c.Contents = contents
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["dislike.go"],
importpath = "go-common/app/interface/main/app-channel/model/dislike",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,6 @@
package dislike
type DisklikeReason struct {
ReasonID int `json:"reason_id,omitempty"`
ReasonName string `json:"reason_name,omitempty"`
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"feed.go",
"feed2.go",
],
importpath = "go-common/app/interface/main/app-channel/model/feed",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card:go_default_library",
"//app/interface/main/app-card/model/card/audio:go_default_library",
"//app/interface/main/app-card/model/card/bangumi:go_default_library",
"//app/interface/main/app-card/model/card/live:go_default_library",
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-card/model/card/show:go_default_library",
"//app/interface/main/app-channel/model:go_default_library",
"//app/interface/main/app-channel/model/activity:go_default_library",
"//app/interface/main/app-channel/model/card:go_default_library",
"//app/interface/main/app-channel/model/channel:go_default_library",
"//app/interface/main/app-channel/model/dislike:go_default_library",
"//app/interface/main/app-channel/model/recommend:go_default_library",
"//app/interface/main/tag/model:go_default_library",
"//app/interface/openplatform/article/model:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/episode/v1:go_default_library",
"//library/time: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"],
)

View File

@@ -0,0 +1,851 @@
package feed
import (
"encoding/json"
"strconv"
"strings"
"time"
"go-common/app/interface/main/app-card/model/card/audio"
"go-common/app/interface/main/app-card/model/card/bangumi"
cardlive "go-common/app/interface/main/app-card/model/card/live"
"go-common/app/interface/main/app-card/model/card/operate"
shopping "go-common/app/interface/main/app-card/model/card/show"
"go-common/app/interface/main/app-channel/model"
"go-common/app/interface/main/app-channel/model/activity"
"go-common/app/interface/main/app-channel/model/card"
"go-common/app/interface/main/app-channel/model/channel"
"go-common/app/interface/main/app-channel/model/dislike"
"go-common/app/interface/main/app-channel/model/recommend"
bustag "go-common/app/interface/main/tag/model"
tag "go-common/app/interface/main/tag/model"
article "go-common/app/interface/openplatform/article/model"
account "go-common/app/service/main/account/model"
"go-common/app/service/main/archive/model/archive"
relation "go-common/app/service/main/relation/model"
episodegrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
xtime "go-common/library/time"
)
const (
_seasonNoSeason = 1
_seasonUpper = 4
_activityForm = "2006-01-02 15:04:05"
_convergeMinCount = 2
)
type Show struct {
Topic *Item `json:"topic,omitempty"`
Feed []*Item `json:"feed"`
}
// Item is feed item,
type Item struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Cover string `json:"cover,omitempty"`
URI string `json:"uri,omitempty"`
Redirect string `json:"redirect,omitempty"`
RedirectURI string `json:"redirect_uri,omitempty"`
Param string `json:"param,omitempty"`
Goto string `json:"goto,omitempty"`
ViewType string `json:"view_type,omitempty"`
Kind string `json:"kind,omitempty"`
Desc string `json:"desc,omitempty"`
Play int `json:"play,omitempty"`
Danmaku int `json:"danmaku,omitempty"`
Reply int `json:"reply,omitempty"`
Fav int `json:"favorite,omitempty"`
Coin int `json:"coin,omitempty"`
Share int `json:"share,omitempty"`
Like int `json:"like,omitempty"`
Count int `json:"count,omitempty"`
Status int8 `json:"status,omitempty"`
Type int8 `json:"type,omitempty"`
Badge string `json:"badge,omitempty"`
StatType int8 `json:"stat_type,omitempty"`
RcmdReason *RcmdReason `json:"rcmd_reason,omitempty"`
Item []*Item `json:"item,omitempty"`
// sortedset index
Idx int64 `json:"idx,omitempty"`
// av info
Cid int64 `json:"cid,omitempty"`
Rid int32 `json:"tid,omitempty"`
TName string `json:"tname,omitempty"`
Tag *Tag `json:"tag,omitempty"`
DisklikeReasons []*dislike.DisklikeReason `json:"dislike_reasons,omitempty"`
PTime xtime.Time `json:"ctime,omitempty"`
Autoplay int32 `json:"autoplay,omitempty"`
// av stat
Duration int64 `json:"duration,omitempty"`
// upper
Mid int64 `json:"mid,omitempty"`
Name string `json:"name,omitempty"`
Face string `json:"face,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Fans int64 `json:"fans,omitempty"`
RecCnt int `json:"recent_count,omitempty"`
Recent []*Item `json:"recent,omitempty"`
Official *OfficialInfo `json:"official,omitempty"`
// live
Online int `json:"online,omitempty"`
Area string `json:"area,omitempty"`
AreaID int `json:"area_id,omitempty"`
Area2 *Area2 `json:"area2,omitempty"`
// bangumi
Index string `json:"index,omitempty"`
IndexTitle string `json:"index_title,omitempty"`
CoverMark string `json:"cover_mark,omitempty"`
Finish bool `json:"finish,omitempty"`
LatestIndex string `json:"last_index,omitempty"`
// bangumi recommend
Updates int `json:"updates,omitempty"`
// live or bangumi
From int8 `json:"from,omitempty"`
// adviertisement
RequestID string `json:"request_id,omitempty"`
CreativeID int64 `json:"creative_id,omitempty"`
SrcID int `json:"src_id,omitempty"`
IsAd bool `json:"is_ad,omitempty"`
IsAdLoc bool `json:"is_ad_loc,omitempty"`
AdCb string `json:"ad_cb,omitempty"`
ShowURL string `json:"show_url,omitempty"`
ClickURL string `json:"click_url,omitempty"`
ClientIP string `json:"client_ip,omitempty"`
CmMark int64 `json:"cm_mark,omitempty"`
AdIndex int `json:"ad_index,omitempty"`
Extra json.RawMessage `json:"extra,omitempty"`
CardIndex int `json:"card_index,omitempty"`
// activity
STime string `json:"stime,omitempty"`
ETime string `json:"etime,omitempty"`
// tag
Tags []*channel.Tag `json:"tags,omitempty"`
// rank
Cover1 string `json:"cover1,omitempty"`
Cover2 string `json:"cover2,omitempty"`
Cover3 string `json:"cover3,omitempty"`
// banner`
Hash string `json:"hash,omitempty"`
// upper article
Covers []string `json:"covers,omitempty"`
Temple int `json:"temple,omitempty"`
Template int `json:"template,omitempty"`
Category *Category `json:"category,omitempty"`
BannerURL string `json:"banner_url,omitempty"`
// game download
Button *Button `json:"button,omitempty"`
Download int32 `json:"download,omitempty"`
BigCover string `json:"big_cover,omitempty"`
// special
HideBadge bool `json:"hide_badge,omitempty"`
Ratio float64 `json:"ratio,omitempty"`
// shopping
City string `json:"city,omitempty"`
PType string `json:"ptype,omitempty"`
Price string `json:"price,omitempty"`
Square string `json:"square,omitempty"`
// news
Content string `json:"content,omitempty"`
// bigdata source
Source string `json:"-"`
AvFeature json.RawMessage `json:"-"`
// common
GotoOrg string `json:"-"`
FromType string `json:"from_type,omitempty"`
Pos int `json:"-"`
// audio
SongTitle string `json:"song_title,omitempty"`
}
type Tag struct {
TagID int64 `json:"tag_id,omitempty"`
TagName string `json:"tag_name,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Count *TagCount `json:"count,omitempty"`
Name string `json:"name,omitempty"`
URI string `json:"uri,omitempty"`
//channel
ID int64 `json:"id,omitempty"`
Face string `json:"face,omitempty"`
Fans int `json:"fans,omitempty"`
}
type RcmdReason struct {
ID int `json:"id,omitempty"`
Content string `json:"content,omitempty"`
BgColor string `json:"bg_color,omitempty"`
IconLocation string `json:"icon_location,omitempty"`
Message string `json:"message,omitempty"`
}
type TagCount struct {
Atten int `json:"atten,omitempty"`
}
type Category struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Children *Category `json:"children,omitempty"`
}
type Button struct {
Name string `json:"name,omitempty"`
URI string `json:"uri,omitempty"`
RedirectURI string `json:"redirect_uri,omitempty"`
}
type Area2 struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Children *Area2 `json:"children,omitempty"`
}
type OfficialInfo struct {
Role int8 `json:"role,omitempty"`
Title string `json:"title,omitempty"`
Desc string `json:"desc,omitempty"`
}
func (i *Item) fillArcStat(a *archive.Archive3) {
if a.Access == 0 {
i.Play = int(a.Stat.View)
}
i.Danmaku = int(a.Stat.Danmaku)
i.Reply = int(a.Stat.Reply)
i.Fav = int(a.Stat.Fav)
i.Coin = int(a.Stat.Coin)
i.Share = int(a.Stat.Share)
i.Like = int(a.Stat.Like)
}
func (i *Item) FromPlayerAv(a *archive.ArchiveWithPlayer) {
if i.Title == "" {
i.Title = a.Title
}
if i.Cover == "" {
i.Cover = model.CoverURLHTTPS(a.Pic)
} else {
i.Cover = model.CoverURLHTTPS(i.Cover)
}
i.Param = strconv.FormatInt(a.Aid, 10)
i.Goto = model.GotoAv
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, model.AvPlayHandler(a.Archive3, a.PlayerInfo))
i.Cid = a.FirstCid
i.Rid = a.TypeID
i.TName = a.TypeName
i.Desc = strconv.Itoa(int(a.Stat.Danmaku)) + "弹幕"
i.fillArcStat(a.Archive3)
i.Duration = a.Duration
i.Mid = a.Author.Mid
i.Name = a.Author.Name
i.Face = a.Author.Face
i.PTime = a.PubDate
i.Cid = a.FirstCid
i.Autoplay = a.Rights.Autoplay
}
func (i *Item) FromDislikeReason() {
i.DisklikeReasons = []*dislike.DisklikeReason{
&dislike.DisklikeReason{ReasonID: _seasonUpper, ReasonName: "UP主:" + i.Name},
&dislike.DisklikeReason{ReasonID: _seasonNoSeason, ReasonName: "不感兴趣"},
}
}
func (i *Item) FromRcmdReason(c *card.Card) {
var content string
switch c.ReasonType {
case 0:
content = ""
case 1:
content = "编辑精选"
case 2:
content = "热门推荐"
case 3:
content = c.Reason
}
if content != "" {
i.RcmdReason = &RcmdReason{ID: 1, Content: content, BgColor: "yellow", IconLocation: "left_top"}
}
}
func (i *Item) FromLive(r *cardlive.Room) {
if r.LiveStatus != 1 || r.Title == "" || r.Cover == "" {
return
}
i.Title = r.Title
i.Cover = r.Cover
i.Goto = model.GotoLive
i.Param = strconv.FormatInt(r.RoomID, 10)
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, model.LiveRoomHandler(r))
i.Name = r.Uname
i.Mid = r.UID
i.Face = r.Face
i.Online = int(r.Online)
i.Autoplay = 1
// i.Area = r.Area
// i.AreaID = r.AreaID
i.Area2 = &Area2{ID: r.AreaV2ParentID, Name: r.AreaV2ParentName, Children: &Area2{ID: r.AreaV2ID, Name: r.AreaV2Name}}
i.Autoplay = 1
}
func (i *Item) FromSeason(b *bangumi.Season) {
if i.Title == "" {
i.Title = b.Title
}
if i.Cover == "" {
i.Cover = b.Cover
}
i.Goto = model.GotoUpBangumi
i.Param = strconv.FormatInt(b.SeasonID, 10)
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, nil)
i.Play = int(b.PlayCount)
i.Fav = int(b.Favorites)
i.Type = b.SeasonType
i.Badge = b.TypeBadge
i.Desc = b.UpdateDesc
i.Face = b.SeasonCover
i.Square = b.SeasonCover
}
func (i *Item) FromPGCSeason(s *episodegrpc.EpisodeCardsProto) {
if i.Title == "" {
i.Title = s.Season.Title
}
if i.Cover == "" {
i.Cover = s.Cover
}
i.Goto = model.GotoBangumi
i.Param = strconv.Itoa(int(s.EpisodeId))
i.URI = model.FillURI(model.GotoBangumi, i.Param, 0, 0, 0, nil)
i.Index = s.Title
i.IndexTitle = s.LongTitle
i.Status = int8(s.Season.SeasonStatus)
i.CoverMark = s.Season.Badge
i.Play = int(s.Season.Stat.View)
i.Fav = int(s.Season.Stat.Follow)
i.Type = int8(s.Season.SeasonType)
i.Badge = s.Season.SeasonTypeName
if s.Season.IsFinish == 1 {
i.Finish = true
}
i.Count = int(s.Season.TotalCount)
i.LatestIndex = s.Title
i.Desc = s.Season.NewEpShow
i.Face = s.Season.Cover
i.Square = s.Season.Cover
}
func (i *Item) FromActivity(a *activity.Activity, now time.Time) {
stime, err := time.ParseInLocation(_activityForm, a.STime, time.Local)
if err != nil {
return
}
etime, err := time.ParseInLocation(_activityForm, a.ETime, time.Local)
if err != nil {
return
}
if now.After(etime) {
i.Status = 1
} else if now.Before(stime) {
i.Status = 2
}
i.Title = a.Name
i.Cover = a.H5Cover
i.Goto = model.GotoActivity
i.URI = model.FillURI(i.Goto, a.H5URL, 0, 0, 0, nil)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, 0)
i.Desc = a.Desc
i.STime = a.STime
i.ETime = a.ETime
i.Param = strconv.FormatInt(a.ID, 10)
}
func (i *Item) FromTopic(a *activity.Activity) {
i.Title = a.Name
i.Cover = a.H5Cover
i.Goto = model.GotoTopic
i.URI = model.FillURI(i.Goto, a.H5URL, 0, 0, 0, nil)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, 0)
i.Desc = a.Desc
i.Param = strconv.FormatInt(a.ID, 10)
}
func (i *Item) FromSpecial(id int64, title, cover, desc, url string, typ int, badge string, size string) {
if title == "" || cover == "" {
return
}
i.Title = title
i.Cover = cover
i.Goto = model.GotoSpecial
i.URI = model.FillURI(i.Goto, url, typ, 0, 0, nil)
i.Redirect = model.FillRedirect(i.Goto, typ)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, typ)
i.Desc = desc
i.Param = strconv.FormatInt(id, 10)
i.HideBadge = true
i.Badge = badge
var ratio float64
if size == "1020x300" {
ratio = 34
} else if size == "1020x378" {
ratio = 27
}
i.Ratio = ratio
}
func (i *Item) FromTopstick(id int64, title, cover, desc, url string, typ int) {
if title == "" {
return
}
i.Title = title
i.Goto = model.GotoTopstick
i.URI = model.FillURI(i.Goto, url, typ, 0, 0, nil)
i.Redirect = model.FillRedirect(i.Goto, typ)
if desc == "" {
i.Desc = "立即查看"
} else {
i.Desc = desc
}
i.Param = strconv.FormatInt(id, 10)
}
func (i *Item) FromSpecialS(id int64, title, cover, desc, url string, typ int, badge string) {
if title == "" || cover == "" {
return
}
i.Title = title
i.Cover = cover
i.Goto = model.GotoSpecialS
i.URI = model.FillURI(i.Goto, url, typ, 0, 0, nil)
i.Redirect = model.FillRedirect(i.Goto, typ)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, typ)
i.Desc = desc
i.Param = strconv.FormatInt(id, 10)
i.HideBadge = true
i.Badge = badge
}
func (i *Item) FromConverge(c *operate.Converge, am map[int64]*archive.ArchiveWithPlayer, rm map[int64]*cardlive.Room, artm map[int64]*article.Meta) {
if len(c.Items) < _convergeMinCount {
return
}
cis := []*Item{}
for _, content := range c.Items {
ci := &Item{Title: content.Title}
switch content.Goto {
case model.GotoAv:
if a, ok := am[content.Pid]; ok && a.IsNormal() {
if ci.Title == "" {
ci.Title = a.Title
}
ci.Cover = a.Pic
ci.Goto = model.GotoAv
ci.Param = strconv.FormatInt(a.Aid, 10)
ci.URI = model.FillURI(ci.Goto, ci.Param, 0, 0, 0, model.AvPlayHandler(a.Archive3, a.PlayerInfo))
ci.fillArcStat(a.Archive3)
ci.Duration = a.Duration
cis = append(cis, ci)
}
case model.GotoLive:
if r, ok := rm[content.ID]; ok {
if r.LiveStatus == 0 || r.Title == "" || r.Cover == "" {
continue
}
if ci.Title == "" {
ci.Title = r.Title
}
ci.Cover = r.Cover
ci.Goto = model.GotoLive
ci.Param = strconv.FormatInt(r.RoomID, 10)
ci.Online = int(r.Online)
ci.URI = model.FillURI(ci.Goto, ci.Param, 0, 0, 0, model.LiveRoomHandler(r))
// ci.RedirectURI = model.FillRedirectURI(ci.Goto, ci.URI, 0)
ci.Badge = "直播"
cis = append(cis, ci)
}
case model.GotoArticle:
if art, ok := artm[content.ID]; ok {
ci.Title = art.Title
ci.Desc = art.Summary
if len(art.ImageURLs) != 0 {
ci.Cover = art.ImageURLs[0]
}
ci.Goto = model.GotoArticle
ci.Param = strconv.FormatInt(art.ID, 10)
ci.URI = model.FillURI(ci.Goto, ci.Param, 0, 0, 0, nil)
if art.Stats != nil {
ci.fillArtStat(art)
}
ci.Badge = "文章"
cis = append(cis, ci)
}
}
}
if len(cis) < _convergeMinCount {
return
}
i.Item = cis
i.Goto = model.GotoConverge
i.URI = model.FillURI(i.Goto, c.ReValue, c.ReType, 0, 0, nil)
i.Redirect = model.FillRedirect(i.Goto, c.ReType)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, c.ReType)
i.Title = c.Title
i.Cover = c.Cover
i.Param = strconv.FormatInt(c.ID, 10)
}
func (i *Item) fillArtStat(m *article.Meta) {
i.Play = int(m.Stats.View)
i.Reply = int(m.Stats.Reply)
}
func (i *Item) FromGameDownloadS(d *operate.Download, plat int8, build int) {
i.Title = d.Title
i.Cover = d.DoubleCover
i.BigCover = d.Cover
i.Goto = model.GotoGameDownloadS
i.ViewType = "bili_game_download_layout"
i.Desc = d.Desc
i.URI = model.FillURI(i.Goto, d.URLValue, d.URLType, plat, build, nil)
i.Redirect = model.FillRedirect(i.Goto, d.URLType)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, d.URLType)
i.Face = d.Icon
i.Button = &Button{Name: d.ButtonText, URI: model.FillURI(i.Goto, d.ReValue, d.ReType, plat, build, nil)}
i.Param = strconv.FormatInt(d.ID, 10)
i.Download = d.Number
}
func (i *Item) FromGameDownload(d *operate.Download, plat int8, build int) {
if d.URLValue == "" || d.ReValue == "" {
return
}
i.Title = d.Title
i.Cover = d.Cover
i.Goto = model.GotoGameDownload
i.ViewType = "bili_game_download_layout"
i.Desc = d.Desc
i.URI = model.FillURI(i.Goto, d.URLValue, d.URLType, plat, build, nil)
i.Redirect = model.FillRedirect(i.Goto, d.URLType)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, d.URLType)
i.Face = d.Icon
i.Button = &Button{Name: d.ButtonText, URI: model.FillURI(i.Goto, d.ReValue, d.ReType, plat, build, nil)}
i.Param = strconv.FormatInt(d.ID, 10)
i.Download = d.Number
}
func (i *Item) FromArticle(m *article.Meta) {
if m.State < 0 || (m.TemplateID != 3 && m.TemplateID != 4) {
return
}
i.Title = m.Title
i.Desc = m.Summary
i.Covers = m.ImageURLs
i.Goto = model.GotoArticle
i.Param = strconv.FormatInt(m.ID, 10)
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, nil)
if m.Author != nil {
i.Mid = m.Author.Mid
i.Name = m.Author.Name
i.Face = m.Author.Face
}
if len(m.Categories) >= 2 && m.Categories[0] != nil && m.Categories[1] != nil {
i.Category = &Category{ID: m.Categories[0].ID, Name: m.Categories[0].Name}
i.Category.Children = &Category{ID: m.Categories[1].ID, Name: m.Categories[1].Name}
}
if m.Stats != nil {
i.fillArtStat(m)
}
// i.Temple = int(m.TemplateID)
// if i.Temple == 4 {
// i.Temple = 1
// }
i.Template = int(m.TemplateID)
i.BannerURL = m.BannerURL
i.PTime = m.PublishTime
}
func (i *Item) FromArticleS(m *article.Meta) {
if m.State < 0 {
return
}
i.Title = m.Title
i.Desc = m.Summary
i.Covers = m.ImageURLs
i.Goto = model.GotoArticleS
i.Param = strconv.FormatInt(m.ID, 10)
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, nil)
if m.Author != nil {
i.Mid = m.Author.Mid
i.Name = m.Author.Name
i.Face = m.Author.Face
}
if len(m.Categories) >= 2 && m.Categories[0] != nil && m.Categories[1] != nil {
i.Category = &Category{ID: m.Categories[0].ID, Name: m.Categories[0].Name}
i.Category.Children = &Category{ID: m.Categories[1].ID, Name: m.Categories[1].Name}
}
if m.Stats != nil {
i.fillArtStat(m)
}
// i.Temple = int(m.TemplateID)
i.Template = int(m.TemplateID)
i.BannerURL = m.BannerURL
i.PTime = m.PublishTime
}
func (i *Item) FromShoppingS(c *shopping.Shopping) {
if c.Name == "" || c.PerformanceImage == "" || c.URL == "" {
return
}
i.Title = c.Name
if strings.HasPrefix(c.PerformanceImage, "http:") || strings.HasPrefix(c.PerformanceImage, "https:") {
i.Cover = c.PerformanceImage
} else {
i.Cover = "http:" + c.PerformanceImage
}
i.Goto = model.GotoShoppingS
i.URI = model.FillURI(i.Goto, c.URL, 0, 0, 0, nil)
// i.RedirectURI = model.FillRedirectURI(i.Goto, i.URI, 0)
i.STime = c.STime
i.ETime = c.ETime
i.City = c.CityName
if len(c.Tags) != 0 {
i.PType = c.Tags[0].TagName
}
i.Param = strconv.FormatInt(c.ID, 10)
// 竖图
i.Subtitle = c.Subname
i.Price = c.Pricelt
i.Desc = c.Want
i.Type = c.Type
}
func (i *Item) FromAudio(a *audio.Audio) {
i.Title = a.Title
i.Cover = a.CoverURL
i.Param = strconv.FormatInt(a.MenuID, 10)
i.Goto = model.GotoAudio
i.URI = model.FillURI(i.Goto, i.Param, 0, 0, 0, nil) + "?from=tianma"
i.Play = int(a.PlayNum)
i.Count = a.RecordNum
i.Fav = int(a.FavoriteNum)
i.Face = a.Face
titles := make([]string, 0, len(a.Songs))
for index, song := range a.Songs {
if song != nil || song.Title != "" {
titles = append(titles, song.Title)
if index == 0 {
i.SongTitle = song.Title
}
}
}
i.Desc = strings.Join(titles, ",")
for _, ctg := range a.Ctgs {
tag := &channel.Tag{ID: ctg.ItemID, Name: ctg.ItemVal}
i.Tags = append(i.Tags, tag)
if len(i.Tags) == 2 {
break
}
}
if len(a.Ctgs) != 0 {
id := a.Ctgs[0].ItemID
name := a.Ctgs[0].ItemVal
if len(a.Ctgs) > 1 {
id = a.Ctgs[1].ItemID
name += "·" + a.Ctgs[1].ItemVal
}
i.Tag = &Tag{Name: name, URI: model.FillURI(model.GotoAudioTag, strconv.FormatInt(id, 10), 0, 0, 0, nil) + "?from=tianma"}
}
if a.Type == 5 {
i.Badge = "专辑"
i.Type = 2
} else {
i.Badge = "歌单"
i.Type = 1
}
i.PTime = xtime.Time(a.PaTime)
}
func (i *Item) FromPlayer(a *archive.ArchiveWithPlayer) {
if !a.IsNormal() {
return
}
title := i.Title
if title == "" {
title = a.Title
}
cover := i.Cover
if cover == "" {
cover = a.Pic
}
item := &Item{Title: title, Cover: cover, Param: strconv.FormatInt(a.Aid, 10), Goto: model.GotoAv}
item.URI = model.FillURI(item.Goto, item.Param, 0, 0, 0, model.AvPlayHandler(a.Archive3, a.PlayerInfo))
item.fillArcStat(a.Archive3)
i.Item = []*Item{item}
i.Cid = a.FirstCid
i.Rid = a.TypeID
i.TName = a.TypeName
i.Mid = a.Author.Mid
i.Goto = model.GotoPlayer
i.Name = a.Author.Name
i.Face = a.Author.Face
i.Duration = a.Duration
i.Autoplay = a.Rights.Autoplay
}
func (i *Item) FromPlayerLive(r *cardlive.Room) {
if r.LiveStatus == 0 || r.Title == "" || r.Cover == "" {
return
}
i.Name = r.Uname
i.Mid = r.UID
i.Face = r.Face
item := &Item{Title: r.Title, Cover: r.Cover, Param: strconv.FormatInt(r.RoomID, 10), Goto: model.GotoLive, URI: model.FillURI(i.Goto, i.Param, 0, 0, 0, model.LiveRoomHandler(r))}
item.Online = int(r.Online)
item.Area2 = &Area2{ID: r.AreaV2ParentID, Name: r.AreaV2ParentName, Children: &Area2{ID: r.AreaV2ID, Name: r.AreaV2Name}}
i.Item = []*Item{item}
i.Goto = model.GotoPlayer
i.Autoplay = 1
}
func (i *Item) FromLiveUpRcmd(id int64, cs []*cardlive.Card, card map[int64]*account.Card) {
if len(cs) < 2 {
return
}
is := make([]*Item, 0, 2)
for _, c := range cs[:2] {
if c.LiveStatus != 1 {
return
}
it := &Item{}
it.Title = c.Title
it.Cover = c.ShowCover
it.Goto = model.GotoLive
it.Param = strconv.FormatInt(c.RoomID, 10)
it.URI = model.FillURI(it.Goto, it.Param, 0, 0, 0, model.LiveUpHandler(c))
it.Fans = int64(c.Online)
it.Mid = c.UID
it.Name = c.Uname
it.Badge = "直播"
if card, ok := card[it.Mid]; ok {
if card.Official.Role != 0 {
it.Official = &OfficialInfo{Role: card.Official.Role, Title: card.Official.Title, Desc: card.Official.Desc}
}
}
is = append(is, it)
}
i.Item = is
i.Goto = model.GotoLiveUpRcmd
i.Param = strconv.FormatInt(id, 10)
}
func (i *Item) FromSubscribe(r *operate.Follow, card map[int64]*account.Card, follow map[int64]bool, upStatm map[int64]*relation.Stat, tagm map[int64]*bustag.Tag) {
if r == nil {
return
}
is := make([]*Item, 0, 3)
switch r.Type {
case "upper":
for _, r := range r.Items {
item := &Item{}
if card, ok := card[r.Pid]; ok {
if f, ok := follow[r.Pid]; ok && f {
continue
}
item.Name = card.Name
item.Face = card.Face
item.Mid = card.Mid
if card.Official.Role != 0 {
item.Official = &OfficialInfo{Role: card.Official.Role, Title: card.Official.Title, Desc: card.Official.Desc}
}
item.IsAtten = 0
if stat, ok := upStatm[r.Pid]; ok {
item.Fans = stat.Follower
}
is = append(is, item)
}
}
i.Kind = "upper"
case "channel_three":
for _, r := range r.Items {
item := &Item{}
tg, ok := tagm[r.Pid]
if !ok || tg.IsAtten == 1 {
continue
}
item.Name = tg.Name
item.Face = tg.Cover
item.Fans = int64(tg.Count.Atten)
item.IsAtten = tg.IsAtten
item.Param = strconv.FormatInt(tg.ID, 10)
if item.Face != "" {
is = append(is, item)
}
}
i.Kind = "channel"
}
if len(is) < 3 {
return
}
i.Item = is[:3]
i.Title = r.Title
i.Param = strconv.FormatInt(r.ID, 10)
i.Goto = model.GotoSubscribe
}
func (i *Item) FromSubscribeChannel(r *recommend.Item, tags map[int64]*tag.Tag) {
if len(tags) == 0 {
return
}
is := []*Item{}
for _, item := range r.Items {
if t, ok := tags[item.ID]; ok {
if t.IsAtten == 1 {
continue
}
tmp := &Item{
Name: t.Name,
Face: t.Cover,
Param: strconv.FormatInt(t.ID, 10),
Fans: int64(t.Count.Atten),
IsAtten: t.IsAtten,
}
is = append(is, tmp)
}
}
if len(is) < 3 {
return
}
i.Item = is[:3]
if r.Config != nil {
i.Title = r.Config.Title
}
i.Param = strconv.FormatInt(r.ID, 10)
i.Kind = "channel"
i.Goto = model.GotoSubscribe
}
func (i *Item) FromChannelRcmd(r *operate.Follow, am map[int64]*archive.ArchiveWithPlayer, tagm map[int64]*bustag.Tag) {
if r == nil {
return
}
if a, ok := am[r.Pid]; ok {
i.Goto = model.GotoChannelRcmd
i.URI = model.FillURI(model.GotoAv, strconv.FormatInt(a.Aid, 10), 0, 0, 0, model.AvPlayHandler(a.Archive3, a.PlayerInfo))
i.Title = a.Title
i.Cover = a.Pic
if tag, ok := tagm[r.Tid]; ok {
i.Tag = &Tag{ID: tag.ID, Name: tag.Name, Face: tag.Cover, Fans: tag.Count.Atten, IsAtten: tag.IsAtten}
}
i.Cid = a.FirstCid
i.Autoplay = a.Rights.Autoplay
i.fillArcStat(a.Archive3)
i.Duration = a.Duration
// TODO 等待开启
// percent := i.Like / (i.Like + i.Dislike) * 100
// if percent != 0 {
// i.Desc = strconv.Itoa(percent) + "%的人推荐"
// }
i.Param = strconv.FormatInt(r.ID, 10)
}
}

View File

@@ -0,0 +1,14 @@
package feed
import (
cardm "go-common/app/interface/main/app-card/model/card"
)
type Show2 struct {
Topic cardm.Handler `json:"topic,omitempty"`
Feed []cardm.Handler `json:"feed"`
}
type Tab struct {
Items []cardm.Handler `json:"items"`
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["game.go"],
importpath = "go-common/app/interface/main/app-channel/model/game",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,28 @@
package game
type Download struct {
ID int64
Title string
Desc string
Icon string
Cover string
URLType int
URLValue string
BtnTxt int
ReType int
ReValue string
ButtonText string
DoubleCover string
Number int
}
func (d *Download) CardChange() {
switch d.BtnTxt {
case 0:
d.ButtonText = "下载"
case 1:
d.ButtonText = "预约"
case 2:
d.ButtonText = "查看详情"
}
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["live.go"],
importpath = "go-common/app/interface/main/app-channel/model/live",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,36 @@
package live
type Room struct {
UID int64 `json:"uid"`
RoomID int64 `json:"room_id"`
Title string `json:"title"`
Cover string `json:"cover"`
Uname string `json:"uname"`
Face string `json:"face"`
Online int `json:"online"`
Area string `json:"area"`
AreaID int `json:"area_id"`
LiveStatus int `json:"live_status"`
AreaV2ID int64 `json:"area_v2_id"`
AreaV2Name string `json:"area_v2_name"`
AreaV2ParentID int64 `json:"area_v2_parent_id"`
AreaV2ParentName string `json:"area_v2_parent_name"`
BroadcastType int `json:"broadcast_type,omitempty"`
}
type Feed struct {
RoomID int64 `json:"room_id"`
Face string `json:"face"`
}
type Card struct {
RoomID int64 `json:"roomid,omitempty"`
UID int64 `json:"uid,omitempty"`
Title string `json:"title,omitempty"`
Uname string `json:"uname,omitempty"`
ShowCover string `json:"show_cover,omitempty"`
Online int64 `json:"online,omitempty"`
Attentions int64 `json:"attentions,omitempty"`
LiveStatus int `json:"live_status,omitempty"`
BroadcastType int `json:"broadcast_type,omitempty"`
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["recommend.go"],
importpath = "go-common/app/interface/main/app-channel/model/recommend",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/tag/model:go_default_library",
"//app/service/main/archive/api: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"],
)

View File

@@ -0,0 +1,44 @@
package recommend
import (
"encoding/json"
tag "go-common/app/interface/main/tag/model"
"go-common/app/service/main/archive/api"
)
type Item struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Goto string `json:"goto,omitempty"` // goto: av, live, bangumi, topic, activity, ad
TagID int64 `json:"tid,omitempty"`
From int8 `json:"from,omitempty"`
Source string `json:"source,omitempty"`
AvFeature json.RawMessage `json:"av_feature,omitempty"`
Config *Config `json:"config,omitempty"`
RcmdReason *RcmdReason `json:"rcmd_reason,omitempty"`
StatType int8 `json:"stat_type,omitempty"`
Items []*Item `json:"-"`
Archive *api.Arc `json:"archive,omitempty"`
Tag *tag.Tag `json:"tag,omitempty"`
Limit int `json:"-"`
}
type Config struct {
URI string `json:"uri,omitempty"`
Title string `json:"title,omitempty"`
Cover string `json:"cover,omitempty"`
Content string `json:"content,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
}
type RcmdReason struct {
ID int `json:"id"`
Content string `json:"content"`
BgColor string `json:"bg_color"`
IconLocation string `json:"icon_location"`
Style int `json:"style"`
Font int `jsn:"font"`
Position string `jsn:"position"`
Grounding string `jsn:"grounding"`
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["shopping.go"],
importpath = "go-common/app/interface/main/app-channel/model/shopping",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,19 @@
package shopping
type Card struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
PerformanceImage string `json:"performance_image,omitempty"`
STime string `json:"stime,omitempty"`
ETime string `json:"etime,omitempty"`
Tags []*struct {
TagID int64 `json:"tag_id,omitempty"`
TagName string `json:"tag_name,omitempty"`
} `json:"tags,omitempty"`
CityName string `json:"city_name,omitempty"`
URL string `json:"url,omitempty"`
Subname string `json:"subname,omitempty"`
Pricelt string `json:"pricelt,omitempty"`
Want string `json:"want,omitempty"`
Type int8 `json:"type,omitempty"`
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["special.go"],
importpath = "go-common/app/interface/main/app-channel/model/special",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,12 @@
package special
type Card struct {
ID int64
Title string
Desc string
Cover string
ReType int
ReValue string
Badge string
Size string
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["tab.go"],
importpath = "go-common/app/interface/main/app-channel/model/tab",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

Some files were not shown because too many files have changed in this diff Show More