Create & Init Project...

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

View File

@@ -0,0 +1,89 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["service_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/model/archive:go_default_library",
"//app/interface/main/creative/model/order:go_default_library",
"//app/interface/main/creative/service:go_default_library",
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"archive.go",
"biz.go",
"fav.go",
"history.go",
"mission.go",
"myinfo.go",
"netsafe.go",
"order.go",
"porder.go",
"rules.go",
"service.go",
"staff.go",
"tag.go",
"viewpoint.go",
],
importpath = "go-common/app/interface/main/creative/service/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/videoup/model/archive:go_default_library",
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/dao/account:go_default_library",
"//app/interface/main/creative/dao/activity:go_default_library",
"//app/interface/main/creative/dao/appeal:go_default_library",
"//app/interface/main/creative/dao/archive:go_default_library",
"//app/interface/main/creative/dao/coin:go_default_library",
"//app/interface/main/creative/dao/game:go_default_library",
"//app/interface/main/creative/dao/order:go_default_library",
"//app/interface/main/creative/dao/search:go_default_library",
"//app/interface/main/creative/dao/tag:go_default_library",
"//app/interface/main/creative/dao/template:go_default_library",
"//app/interface/main/creative/model/activity:go_default_library",
"//app/interface/main/creative/model/appeal:go_default_library",
"//app/interface/main/creative/model/archive:go_default_library",
"//app/interface/main/creative/model/game:go_default_library",
"//app/interface/main/creative/model/order:go_default_library",
"//app/interface/main/creative/model/search:go_default_library",
"//app/interface/main/creative/model/tag:go_default_library",
"//app/interface/main/creative/service:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/stat/prom:go_default_library",
"//library/sync/errgroup: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,713 @@
package archive
import (
"context"
"encoding/json"
"fmt"
"go-common/app/interface/main/creative/model/activity"
"go-common/app/interface/main/creative/model/appeal"
"go-common/app/interface/main/creative/model/archive"
"go-common/app/interface/main/creative/model/search"
"go-common/app/interface/main/creative/model/tag"
pubSvc "go-common/app/interface/main/creative/service"
"go-common/app/service/main/archive/api"
mdlarc "go-common/app/service/main/archive/model/archive"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/sync/errgroup"
xtime "go-common/library/time"
"strings"
"time"
)
// SimpleArchiveVideos fn
func (s *Service) SimpleArchiveVideos(c context.Context, mid, aid int64, ak, ck, ip string) (ap *archive.SimpleArchiveVideos, err error) {
var (
sa *archive.SpArchive
svs []*archive.SpVideo
)
// User identity && permission check, logic from project 'member'
card, err := s.acc.Card(c, mid, ip)
if err != nil {
log.Error("s.acc.Profile(%d,%s) error(%v)", mid, ck, err)
return
}
if sa, err = s.arc.SimpleArchive(c, aid, ip); err != nil {
log.Error("s.arc.SimpleArchive(%d) error(%v)", aid, err)
return
}
if sa == nil {
log.Error("s.arc.SimpleArchive(%d) not found", aid)
err = ecode.NothingFound
return
}
if sa.Mid != mid {
err = ecode.NothingFound
return
}
if svs, err = s.arc.SimpleVideos(c, aid, ip); err != nil {
log.Error("s.arc.SimpleVideos(%d) error(%v)", aid, err)
return
}
for index, sv := range svs {
if sv.Status == -100 {
sv.DmActive = 0
} else {
sv.DmActive = 1
}
svs[index] = sv
}
acceptAss := card.Rank > 15000 || card.Rank == 20000
ap = &archive.SimpleArchiveVideos{Archive: sa, SpVideos: svs, AcceptAss: acceptAss}
return
}
// View get archive.
func (s *Service) View(c context.Context, mid, aid int64, ip, platform string) (av *archive.ArcVideo, err error) {
if av, err = s.arc.View(c, mid, aid, ip, archive.NeedPoi(platform), archive.NeedVote(platform)); err != nil {
log.Error("s.arc.View(%d,%d) error(%v)", mid, aid, err)
return
}
if av == nil || av.Archive == nil {
log.Error("s.arc.View(%d) not found", mid)
err = ecode.NothingFound
return
}
av.Archive.NilPoiObj(platform)
av.Archive.NilVote()
// check white
isWhite := false
for _, m := range s.c.Whitelist.ArcMids {
if m == mid {
isWhite = true
break
}
}
if !isWhite {
if av.Archive.Mid != mid {
err = ecode.AccessDenied
return
}
}
var (
a = av.Archive
vs = av.Videos
)
// add reject reason
if (a.State == mdlarc.StateForbidRecicle || a.State == mdlarc.StateForbidLock) && a.RejectReason == "" {
var c = 0
for _, v := range vs {
if v.Status == mdlarc.StateForbidRecicle ||
v.Status == mdlarc.StateForbidLock ||
v.Status == mdlarc.StateForbidXcodeFail {
c++
}
}
a.RejectReason = fmt.Sprintf("稿件中发现%d个问题。", c)
}
a.Cover = pubSvc.CoverURL(a.Cover)
if a.OrderID != 0 {
if a.OrderID, a.OrderName, _, err = s.order.OrderByAid(c, aid); err != nil {
log.Error("s.order.OrderByAid(%d,%d) error(%v)", mid, aid, err)
err = nil
}
}
if a.MissionID > 0 {
var act *activity.Activity
if act, err = s.act.Subject(c, a.MissionID); err != nil {
log.Error("s.act.Subject a.MissionID(%d) error(%v)", a.MissionID, err)
err = nil
return
}
a.MissionName = act.Name
}
if a.Porder != nil && a.Porder.Official == 1 && a.Porder.IndustryID == 1 {
if v, ok := s.gameMap[a.Porder.BrandID]; ok {
a.Porder.BrandName = v.GameName
}
}
if a.UgcPay == 1 {
a.UgcPayInfo = s.p.FillPayInfo(c, a, s.c.UgcPay, ip)
}
return
}
// Del fn
// 1,unbind act;2,decrease coin;3,unbind order;4,clean memcache
func (s *Service) Del(c context.Context, mid, aid int64, ip string) (err error) {
av, err := s.View(c, mid, aid, ip, archive.PlatformWeb)
if err != nil {
return
}
if av == nil || av.Archive == nil {
log.Error("s.arc.Del NothingFound (%d,%d,%d) error(%v)", mid, av.Archive.Mid, aid, err)
err = ecode.NothingFound
return
}
if av.Archive.Mid != mid {
log.Error("s.arc.Del AccessDenied (%d,%d,%d) error(%v)", mid, av.Archive.Mid, aid, err)
err = ecode.AccessDenied
return
}
if av.Archive.UgcPay == 1 {
canDelTime := xtime.Time(av.Archive.PTime.Time().AddDate(0, 0, s.c.UgcPay.AllowDeleteDays).Unix())
if av.Archive.CTime != av.Archive.PTime && xtime.Time(time.Now().Unix()) < canDelTime {
log.Error("checkEditPay CreativePayForbidDeleteAfterOpen aid(%d) ctime(%v) ptime(%v)", av.Archive.Aid, av.Archive.CTime, av.Archive.PTime)
err = ecode.CreativePayForbidDeleteAfterOpen
return
}
}
if err = s.arc.Del(c, mid, aid, ip); err != nil {
log.Error("s.arc.Del(%d,%d) error(%v)", mid, aid, err)
return
}
var (
a = av.Archive
g = &errgroup.Group{}
ctx = context.TODO()
)
g.Go(func() error {
if e := s.act.Unbind(ctx, aid, a.MissionID, ip); e != nil {
log.Error("s.act.UpdateByAid(%d,%d) error(%v)", aid, a.MissionID, e)
}
return nil
})
g.Go(func() error {
var coins float64
if a.State >= 0 {
coins = -2
} else {
coins = -1
}
if e := s.coin.AddCoin(ctx, mid, aid, coins, ip); e != nil {
log.Error("s.coin.AddCoin(%d,%d,%f,%s) error(%v)", mid, aid, coins, ip, e)
}
return nil
})
g.Go(func() error {
if e := s.order.Unbind(ctx, mid, aid, ip); e != nil {
log.Error("s.order.Unbind(%d,%d,%s) error(%v)", mid, aid, ip, e)
}
return nil
})
g.Go(func() error {
if e := s.arc.DelSubmitCache(ctx, mid, a.Title); e != nil {
log.Error("s.arc.DelSubmitCache (%d,%s,%s) error(%v)", mid, a.Title, ip, e)
}
return nil
})
g.Wait()
s.prom.Incr("archive_del")
return
}
// Archives for app all achives.
func (s *Service) Archives(c context.Context, mid int64, tid int16, kw, order, class, ip string, pn, ps, coop int) (res *search.Result, err error) {
if res, err = s.Search(c, mid, tid, kw, order, class, ip, pn, ps, coop); err != nil {
log.Error("s.Search err(%v)", err)
return
}
if res == nil || res.Archives == nil || len(res.Archives) == 0 {
return
}
for _, av := range res.Archives {
a := &api.Arc{
Aid: av.Archive.Aid,
TypeID: int32(av.Archive.TypeID),
TypeName: av.TypeName,
Copyright: int32(av.Archive.Copyright),
Title: av.Archive.Title,
Desc: av.Archive.Desc,
Attribute: av.Archive.Attribute,
Videos: int64(len(av.Videos)),
Pic: pubSvc.CoverURL(av.Archive.Cover),
State: int32(av.Archive.State),
Access: int32(av.Archive.Access),
Tags: strings.Split(av.Archive.Tag, ","),
Duration: av.Archive.Duration,
MissionID: av.Archive.MissionID,
OrderID: av.Archive.OrderID,
PubDate: av.Archive.PTime,
Ctime: av.Archive.CTime,
}
a.Author = api.Author{
Mid: av.Archive.Mid,
Name: av.Archive.Author,
}
a.Stat = api.Stat{
Aid: av.Stat.Aid,
View: int32(av.Stat.View),
Danmaku: int32(av.Stat.Danmaku),
Reply: int32(av.Stat.Reply),
Fav: int32(av.Stat.Fav),
Coin: int32(av.Stat.Coin),
Share: int32(av.Stat.Share),
NowRank: int32(av.Stat.NowRank),
HisRank: int32(av.Stat.HisRank),
}
ava := &archive.OldArchiveVideoAudit{
Arc: a,
StatePanel: av.StatePanel,
ParentTName: av.ParentTName,
Dtime: av.Archive.DTime,
StateDesc: av.Archive.StateDesc,
RejectReson: av.Archive.RejectReason,
UgcPay: av.Archive.UgcPay,
Attrs: av.Archive.Attrs,
}
if len(av.ArcVideo.Videos) > 0 {
var vas = make([]*archive.OldVideoAudit, 0, len(av.ArcVideo.Videos))
for _, vd := range av.ArcVideo.Videos {
va := &archive.OldVideoAudit{
IndexOrder: vd.Index,
Eptitle: vd.Title,
Reason: vd.RejectReason,
}
ava.VideoAudits = append(vas, va)
}
}
res.OldArchives = append(res.OldArchives, ava)
}
return
}
// Search all achive.
func (s *Service) Search(c context.Context, mid int64, tid int16, keyword, order, class, ip string, pn, ps, coop int) (res *search.Result, err error) {
defer func() {
if res != nil {
// get pending apply num
if coop > 0 {
count, _ := s.arc.CountByMID(c, mid)
res.Applies = &search.ApplyStateCount{
Pending: count,
}
}
}
}()
if res, err = s.sear.ArchivesES(c, mid, tid, keyword, order, class, ip, pn, ps, coop); err != nil {
// search err, use archive-service
log.Error("s.arc.Search(%d) error(%v)", mid, err)
res, err = s.ArchivesFromService(c, mid, class, ip, pn, ps)
if err != nil {
return
}
}
// add arctype *must return
res.ArrType = []*search.TypeCount{}
for _, v := range s.p.TopTypesCache {
t := &search.TypeCount{
Tid: v.ID,
Name: v.Name,
}
if _, ok := res.Type[v.ID]; ok {
t.Count = res.Type[v.ID].Count
}
res.ArrType = append(res.ArrType, t)
}
if res == nil || len(res.Aids) == 0 {
return
}
avm, err := s.arc.Views(c, mid, res.Aids, ip)
if err != nil {
log.Error("s.arc.Views res.Aids(%v), ip(%s) err(%v)", res.Aids, ip, err)
return
}
// get arc stats
as, _ := s.arc.Stats(c, res.Aids, ip)
// archives
for _, aid := range res.Aids {
av := avm[aid]
if av == nil {
continue
}
a := av.Archive
a.Cover = pubSvc.CoverURL(a.Cover)
ava := &archive.ArcVideoAudit{ArcVideo: av}
// arc stat info
if _, ok := as[aid]; ok {
ava.Stat = as[aid]
} else {
ava.Stat = &api.Stat{}
}
// typename
if _, ok := s.p.TypeMapCache[a.TypeID]; ok {
ava.TypeName = s.p.TypeMapCache[a.TypeID].Name
}
// parent typename
if _, ok := s.p.TypeMapCache[a.TypeID]; ok {
if _, ok := s.p.TypeMapCache[s.p.TypeMapCache[a.TypeID].Parent]; ok {
ava.ParentTName = s.p.TypeMapCache[s.p.TypeMapCache[a.TypeID].Parent].Name
}
}
// state panel
ava.StatePanel = archive.StatePanel(a.State)
// state desc
ava.Archive.StateDesc = s.c.StatDesc(int(a.State))
// not pubbed videos for reason
unpubedVideos := make([]*archive.Video, 0, len(ava.Videos))
for _, v := range ava.Videos {
if v.Status == -2 || v.Status == -4 || v.Status == -16 {
unpubedVideos = append(unpubedVideos, v)
}
}
c := len(unpubedVideos)
if c > 0 {
a.RejectReason = fmt.Sprintf("稿件中发现%d个问题。", c)
}
// set attrs
attrs := &archive.Attrs{
IsCoop: int8(ava.AttrVal(archive.AttrBitIsCoop)),
IsOwner: ava.IsOwner(mid),
}
ava.Archive.Attrs = attrs
ava.Videos = unpubedVideos
res.Archives = append(res.Archives, ava)
}
return
}
// ApplySearch all achive.
func (s *Service) ApplySearch(c context.Context, mid int64, tid int16, keyword, state string, pn, ps int) (res *search.StaffApplyResult, err error) {
var mids []int64
if res, err = s.sear.ArchivesStaffES(c, mid, tid, keyword, state, pn, ps); err != nil {
log.Error("s.arc.ArchivesStaffES(%d) error(%v)", mid, err)
return
}
// add arctype *must return
res.ArrType = []*search.TypeCount{}
for _, v := range s.p.TopTypesCache {
t := &search.TypeCount{
Tid: v.ID,
Name: v.Name,
}
if _, ok := res.Type[v.ID]; ok {
t.Count = res.Type[v.ID].Count
}
res.ArrType = append(res.ArrType, t)
}
if res == nil || len(res.Aids) == 0 {
return
}
// get archives
avm, err := s.arc.Views(c, mid, res.Aids, "")
if err != nil {
log.Error("s.arc.Views res.Aids(%v), ip(%s) err(%v)", res.Aids, err)
return
}
// get applies
apm := make(map[int64]*archive.StaffApply)
applies, err := s.arc.StaffApplies(c, mid, res.Aids)
for _, ap := range applies {
apm[ap.ApplyAID] = ap
}
// combine
for _, aid := range res.Aids {
av := avm[aid]
if av == nil {
continue
}
a := av.Archive
a.Cover = pubSvc.CoverURL(a.Cover)
ava := &archive.ArcVideoAudit{ArcVideo: av}
// typename
if _, ok := s.p.TypeMapCache[a.TypeID]; ok {
ava.TypeName = s.p.TypeMapCache[a.TypeID].Name
}
// parent typename
if _, ok := s.p.TypeMapCache[a.TypeID]; ok {
if _, ok := s.p.TypeMapCache[s.p.TypeMapCache[a.TypeID].Parent]; ok {
ava.ParentTName = s.p.TypeMapCache[s.p.TypeMapCache[a.TypeID].Parent].Name
}
}
// state panel
ava.StatePanel = archive.StatePanel(a.State)
// state desc
ava.Archive.StateDesc = s.c.StatDesc(int(a.State))
// not pubbed videos for reason
unpubedVideos := make([]*archive.Video, 0, len(ava.Videos))
for _, v := range ava.Videos {
if v.Status == -2 || v.Status == -4 || v.Status == -16 {
unpubedVideos = append(unpubedVideos, v)
}
}
c := len(unpubedVideos)
if c > 0 {
a.RejectReason = fmt.Sprintf("稿件中发现%d个问题。", c)
}
ava.Videos = unpubedVideos
// get apply
apply := &search.StaffApply{}
if v, ok := apm[aid]; ok {
apply.ID = v.ID
apply.Type = v.Type
apply.Mid = v.ApplyUpMID
apply.State = v.StaffState
apply.ApplyState = v.State
apply.ApplyTitle = v.ApplyTitle
}
// set archive
apply.Archive = ava
mids = append(mids, apply.Mid)
res.Applies = append(res.Applies, apply)
}
// get name
users, _ := s.acc.Infos(c, mids, "")
for _, v := range res.Applies {
if u, ok := users[v.Mid]; ok {
v.Uname = u.Name
}
}
return
}
// Types get typelist.
func (s *Service) Types(c context.Context, lang string) (tps []*archive.Type) {
if _, ok := s.p.TypesCache[lang]; !ok {
lang = "ch"
}
tps = s.p.TypesCache[lang]
return
}
// StaffTitles get staff titles.
func (s *Service) StaffTitles(c context.Context) (titles []*tag.StaffTitle) {
return s.p.StaffTitlesCache
}
// AppTypes fn
func (s *Service) AppTypes(c context.Context, lang string) (tps []*archive.Type) {
if _, ok := s.p.CTypesCache[lang]; !ok {
lang = "ch"
}
tps = s.p.CTypesCache[lang]
for _, val := range tps {
for _, child := range val.Children {
child.Notice = child.AppNotice
}
}
return
}
// Activities get activity list.
func (s *Service) Activities(c context.Context) (acts []*activity.Activity) {
acts = s.p.ActVideoAllCache
return
}
// WebArchives achive list with appeal.
func (s *Service) WebArchives(c context.Context, mid int64, tid int16, keyword, order, class, ip string, pn, ps, coop int) (res *search.Result, err error) {
if res, err = s.Search(c, mid, tid, keyword, order, class, ip, pn, ps, coop); err != nil {
log.Error("s.Search err(%v)", err)
return
}
if res == nil || len(res.Aids) == 0 {
return
}
//做降级
aps, err := s.ap.AppealList(c, mid, appeal.Business, ip)
if err != nil {
log.Error("s.ap.AppealList error(%v)", err)
err = nil
}
if len(aps) == 0 {
return
}
aaMap := make(map[int64]int64, len(aps))
for _, v := range aps {
if appeal.IsOpen(v.BusinessState) {
aaMap[v.Oid] = v.ID
}
}
for _, v := range res.Archives {
v.OpenAppeal = aaMap[v.Archive.Aid]
}
return
}
// Videos get Simple Archive and Videos Info.
func (s *Service) Videos(c context.Context, mid, aid int64, ip string) (sa archive.SimpleArchive, svs []*archive.SimpleVideo, err error) {
var av *archive.ArcVideo
if av, err = s.arc.View(c, mid, aid, ip, 0, 0); err != nil {
log.Error("s.arc.View(%d,%d) error(%v)", mid, aid, err)
return
}
if av == nil {
log.Error("s.arc.View(%d) not found", mid)
err = ecode.RequestErr
return
}
// white list check
isWhite := false
for _, m := range s.c.Whitelist.DataMids {
if m == mid {
isWhite = true
break
}
}
var (
a = av.Archive
vs = av.Videos
)
if !isWhite {
if a.Mid != mid {
err = ecode.AccessDenied
return
}
}
sa.Aid = a.Aid
sa.Title = a.Title
for _, v := range vs {
svs = append(svs, &archive.SimpleVideo{
Cid: v.Cid,
Title: v.Title,
Index: v.Index,
})
}
return
}
// ArchivesFromService get archives from service
func (s *Service) ArchivesFromService(c context.Context, mid int64, class, ip string, pn, ps int) (sres *search.Result, err error) {
aids, count, err := s.arc.UpArchives(c, mid, int64(pn), int64(ps), 0, ip)
if err != nil {
return
}
sres = &search.Result{}
sres.Aids = aids
sres.Page.Pn = pn
sres.Page.Ps = ps
sres.Page.Count = int(count)
return
}
// DescFormat get desc format
func (s *Service) DescFormat(c context.Context, typeid, copyright int64, langStr, ip string) (desc *archive.DescFormat, err error) {
lang := archive.ToLang(langStr)
desc, ok := s.p.DescFmtsCache[typeid][int8(copyright)][lang]
if !ok {
err = nil
}
if desc != nil {
var Components []*struct {
Name interface{}
}
if err = json.Unmarshal([]byte(desc.Components), &Components); err != nil || len(Components) == 0 {
desc = nil
err = nil
}
}
return
}
// AppFormats for app portal list.
func (s *Service) AppFormats(c context.Context) (af []*archive.AppFormat, err error) {
for _, f := range s.p.DescFmtsArrCache {
format := &archive.AppFormat{ID: f.ID, Copyright: f.Copyright, TypeID: f.TypeID}
af = append(af, format)
}
return
}
// Video get video by aid and cid
func (s *Service) Video(c context.Context, mid, aid, cid int64, ip string) (video *api.Page, err error) {
if video, err = s.arc.Video(c, aid, cid, ip); err != nil {
log.Error("s.arc.Video %d,%d,%s | err(%v)", aid, cid, ip, err)
}
return
}
// VideoJam get video traffic jam level from service
// level为0的时候可以忽略错误处理映射表里已经做了前端容错
func (s *Service) VideoJam(c context.Context, ip string) (j *archive.VideoJam, err error) {
level, _ := s.arc.VideoJam(c, ip)
if jam, ok := archive.VjInfo[level]; ok {
j = jam
} else {
j = archive.VjInfo[0]
}
return
}
// DescFormatForApp get desc format length
func (s *Service) DescFormatForApp(c context.Context, typeid, copyright int64, langStr, ip string) (desc *archive.DescFormat, length int, err error) {
var (
descLengthMax = 2000
descLengthMin = 250
ok bool
)
lang := archive.ToLang("")
if desc, ok = s.p.DescFmtsCache[typeid][int8(copyright)][lang]; !ok {
err = nil
}
if typeid == 0 {
length = descLengthMin
} else if desc != nil {
length = descLengthMax
} else {
length = descLengthMin
}
return
}
// Dpub for app view.
func (s *Service) Dpub() (dpub *archive.Dpub) {
now := time.Now()
dpub = &archive.Dpub{
Deftime: xtime.Time(now.Add(time.Duration(14400) * time.Second).Unix()),
DeftimeEnd: xtime.Time(now.Add(time.Duration(15*24) * time.Hour).Unix()),
DeftimeMsg: ecode.String(ecode.VideoupDelayTimeErr.Error()).Message(),
}
return
}
// SimpleArcVideos fn
func (s *Service) SimpleArcVideos(c context.Context, mid int64, tid int16, kw, order, class, ip string, pn, ps, coop int) (res *search.SimpleResult, err error) {
var sres *search.Result
res = &search.SimpleResult{}
if sres, err = s.sear.ArchivesES(c, mid, tid, kw, order, class, ip, pn, ps, coop); err != nil {
log.Error("s.arc.Search mid(%d)|error(%v)", mid, err)
sres, err = s.ArchivesFromService(c, mid, class, ip, pn, ps) // search err, use archive-service
if err != nil {
log.Error("s.ArchivesFromService mid(%d)|error(%v)", mid, err)
return
}
}
if sres == nil || len(sres.Aids) == 0 {
return
}
res.Class = sres.Class
res.Page = sres.Page
avm, err := s.arc.Views(c, mid, sres.Aids, ip)
if err != nil {
log.Error("s.arc.Views mid(%d)|aids(%v)|ip(%s)|err(%v)", mid, sres.Aids, ip, err)
return
}
savs := make([]*search.SimpleArcVideos, 0, len(avm))
for _, aid := range sres.Aids {
av, ok := avm[aid]
if !ok || av == nil || av.Archive == nil {
continue
}
vds := make([]*archive.SimpleVideo, 0, len(av.Videos))
for _, v := range av.Videos {
if v == nil {
continue
}
vd := &archive.SimpleVideo{
Cid: v.Cid,
Title: v.Title,
Index: v.Index,
}
vds = append(vds, vd)
}
sav := &search.SimpleArcVideos{}
sav.Archive = &archive.SimpleArchive{
Aid: av.Archive.Aid,
Title: av.Archive.Title,
}
sav.Videos = vds
savs = append(savs, sav)
}
res.ArchivesVideos = savs
return
}

View File

@@ -0,0 +1,17 @@
package archive
import (
"context"
"time"
model "go-common/app/interface/main/creative/model/archive"
"go-common/library/log"
)
// BIZsByTime list bizs by time and type
func (s *Service) BIZsByTime(c context.Context, start, end *time.Time, tp int8) (bizs []*model.BIZ, err error) {
if bizs, err = s.arc.BIZsByTime(c, start, end, tp); err != nil {
log.Error("s.arc.BIZsByTime error(%+v)", err)
}
return
}

View File

@@ -0,0 +1,43 @@
package archive
import (
"context"
"sort"
"strconv"
"go-common/app/interface/main/creative/model/archive"
)
// get max 5 fav types
func (s *Service) favTypes(c context.Context, mid int64) (favTps []*archive.Type) {
favTps = make([]*archive.Type, 0)
var res map[string]int64
res, _ = s.arc.FavTypes(c, mid)
if len(res) > 0 {
type kv struct {
TidStr string
Timestamp int64
}
var kvSlice []kv
for k, v := range res {
kvSlice = append(kvSlice, kv{k, v})
}
sort.Slice(kvSlice, func(i, j int) bool {
return kvSlice[i].Timestamp > kvSlice[j].Timestamp
})
for _, v := range kvSlice {
tid, _ := strconv.Atoi(v.TidStr)
if tp, ok := s.p.TypeMapCache[int16(tid)]; ok && len(favTps) < 5 {
favTps = append(favTps, tp)
}
}
}
return
}
// Fav fn
func (s *Service) Fav(c context.Context, mid int64) (res map[string]interface{}) {
res = make(map[string]interface{})
res["typelist"] = s.favTypes(c, mid)
return
}

View File

@@ -0,0 +1,41 @@
package archive
import (
"context"
"go-common/app/interface/main/creative/model/archive"
pubSvc "go-common/app/interface/main/creative/service"
"go-common/library/ecode"
"go-common/library/log"
)
// HistoryList get the history of aid
func (s *Service) HistoryList(c context.Context, mid, aid int64, ip string) (historys []*archive.ArcHistory, err error) {
if historys, err = s.arc.HistoryList(c, mid, aid, ip); err != nil {
log.Error("s.arc.HistoryList(%d,%d) err(%v)", mid, aid, err)
return
}
for key, history := range historys {
if history.Mid > 0 && history.Mid != mid {
err = ecode.ArchiveOwnerErr
return
}
historys[key].Cover = pubSvc.CoverURL(history.Cover)
}
return
}
// HistoryView get the history of hid
func (s *Service) HistoryView(c context.Context, mid, hid int64, ip string) (history *archive.ArcHistory, err error) {
if history, err = s.arc.HistoryView(c, mid, hid, ip); err != nil {
log.Error("s.arc.HistoryView(%d,%d) err(%v)", mid, hid, err)
return
}
if history.Mid > 0 && history.Mid != mid {
err = ecode.ArchiveOwnerErr
history = nil
return
}
history.Cover = pubSvc.CoverURL(history.Cover)
return
}

View File

@@ -0,0 +1,25 @@
package archive
import (
"context"
"go-common/app/interface/main/creative/model/activity"
"go-common/library/log"
)
// MissionProtocol fn
func (s *Service) MissionProtocol(c context.Context, missionID int64) (p *activity.Protocol, err error) {
if p, err = s.act.Protocol(c, missionID); err != nil {
log.Error("s.act.Protocol(%d) err(%v)", missionID, err)
return
}
return
}
// MissionOnlineByTid fn
func (s *Service) MissionOnlineByTid(c context.Context, tid, plat int16) (res []*activity.ActWithTP, err error) {
if res, err = s.act.MissionOnlineByTid(c, tid, plat); err != nil {
log.Error("s.act.MissionOnlineByTid(%d,%d) err(%+v)", tid, plat, err)
return
}
return
}

View File

@@ -0,0 +1,54 @@
package archive
import (
"context"
"go-common/library/log"
)
// AllowCommercial fn
func (s *Service) AllowCommercial(c context.Context, mid int64) (ok int) {
isOrder := s.AllowOrderUps(mid)
if isOrder {
log.Info("s.AllowOrderUps mid(%d)", mid)
ok = 1
}
return
}
// AppModuleShowMap fn
// 编辑的时候暂时不允许重新开启动态抽奖或者修改动态抽奖
func (s *Service) AppModuleShowMap(mid int64, lotteryCheck bool) (ret map[string]bool) {
ret = map[string]bool{
"cooperate": true,
"vote": true,
"subtitle": true,
"filter": true,
"audio_record": true,
"camera": true,
"sticker": true,
"videoup_sticker": true,
"theme": true,
"lottery": false,
}
// define by dymc check
if lotteryCheck {
ret["lottery"] = true
}
// isWhite := false
// for _, m := range s.c.Whitelist.ArcMids {
// if m == mid {
// isWhite = true
// break
// }
// }
// define for app module
// if isWhite {
// ret["theme"] = true
// return
// }
// mod := mid % 100
// if mod <= 20 {
// ret["theme"] = true
// }
return
}

View File

@@ -0,0 +1,18 @@
package archive
import (
"context"
)
// AddNetSafeMd5 fn
func (s *Service) AddNetSafeMd5(c context.Context, nid int64, md5 string) (err error) {
err = s.arc.AddNetSafeMd5(c, nid, md5)
go s.NotifyNetSafe(c, nid)
return
}
// NotifyNetSafe fn
func (s *Service) NotifyNetSafe(c context.Context, nid int64) (err error) {
_ = s.arc.NotifyNetSafe(c, nid)
return
}

View File

@@ -0,0 +1,170 @@
package archive
import (
"context"
"time"
"go-common/app/interface/main/creative/model/archive"
"go-common/app/interface/main/creative/model/game"
"go-common/app/interface/main/creative/model/order"
"go-common/app/service/main/archive/api"
arcMdl "go-common/app/service/main/archive/model/archive"
"go-common/library/ecode"
"go-common/library/log"
xtime "go-common/library/time"
)
// ExecuteOrders fn
func (s *Service) ExecuteOrders(c context.Context, mid int64, ip string) (orders []*order.Order, err error) {
if orders, err = s.order.ExecuteOrders(c, mid, ip); err != nil {
log.Error("s.order.ExecuteOrders mid(%d) err(%v)", mid, err)
return
}
return
}
// Oasis for orders.
func (s *Service) Oasis(c context.Context, mid int64, ip string) (oa *order.Oasis, err error) {
if oa, err = s.order.Oasis(c, mid, ip); err != nil {
log.Error("s.order.Oasis mid(%d) err(%v)", mid, err)
return
}
return
}
// ArcOrderGameInfo fn
// platform 1:android;2:ios
func (s *Service) ArcOrderGameInfo(c context.Context, aid int64, platform int, ip string) (gameInfo *game.Info, err error) {
var (
orderID, gameBaseID int64
beginDate xtime.Time
)
if orderID, _, gameBaseID, err = s.order.OrderByAid(c, aid); err != nil {
log.Error("s.order.OrderByAid aid(%d)|ip(%s)|err(%+v)", aid, ip, err)
err = ecode.NothingFound
return
}
if gameBaseID == 0 || orderID == 0 {
log.Error("s.order.OrderByAid aid(%d)|ip(%s) not found", aid, ip)
err = ecode.NothingFound
return
}
if gameInfo, err = s.game.Info(c, gameBaseID, platform, ip); err != nil {
log.Error("s.game.Info aid(%d)|orderID(%d)|gameBaseID(%d)|ip(%s)|err(%+v)", aid, orderID, gameBaseID, ip, err)
err = ecode.NothingFound
return
}
if !gameInfo.IsOnline {
log.Error("s.game.Info IsOnline is false aid(%d)|orderID(%d)|gameBaseID(%d)|ip(%s)|err(%+v)", aid, orderID, gameBaseID, ip, err)
err = ecode.NothingFound
return
}
if beginDate, err = s.order.LaunchTime(c, orderID, ip); err != nil {
log.Error("s.order.LaunchTime aid(%d)|orderID(%d)|gameBaseID(%d)|ip(%s)|err(%+v)", aid, orderID, gameBaseID, ip, err)
return
}
gameInfo.BeginDate = beginDate
gameInfo.BaseID = gameBaseID
return
}
// ArcCommercial fn
func (s *Service) ArcCommercial(c context.Context, aid int64, ip string) (cm *archive.Commercial, err error) {
var (
orderID, gameBaseID int64
beginDate xtime.Time
a *api.Arc
cache = true
)
// try cache
if cm, err = s.arc.ArcCMCache(c, aid); err != nil {
err = nil
cache = false
} else if cm != nil {
s.pCacheHit.Incr("cmarc_cache")
cache = false
return
}
s.pCacheMiss.Incr("cmarc_cache")
// get archive
a, err = s.arc.Archive(c, aid, ip)
if err != nil {
log.Error("arcCommercial aid(%d)|ip(%s)|err(%+v)", aid, ip, err)
err = ecode.NothingFound
return
}
if a == nil {
log.Error("arcCommercial nil aid(%d)|ip(%s)|err(%+v)", aid, ip, err)
err = ecode.NothingFound
return
}
// add cache
defer func() {
if cache {
s.addCache(func() {
if cm == nil {
cm = &archive.Commercial{}
}
s.arc.AddArcCMCache(context.Background(), aid, cm)
})
}
}()
// check order or porder
if a.OrderID > 0 {
// order
if orderID, _, gameBaseID, err = s.order.OrderByAid(c, aid); err != nil {
log.Error("arcCommercial aid(%d)|ip(%s)|error(%+v)", aid, ip, err)
err = ecode.NothingFound
return
}
if gameBaseID == 0 || orderID == 0 {
log.Error("arcCommercial aid(%d)|ip(%s) not found", aid, ip)
err = ecode.NothingFound
return
}
if beginDate, err = s.order.LaunchTime(c, orderID, ip); err != nil {
log.Error("arcCommercial get launch time failed. aid(%d)|orderID(%d)|gameBaseID(%d)|ip(%s)|error(%+v)", aid, orderID, gameBaseID, ip, err)
return
}
// check time
if time.Now().Unix() < beginDate.Time().Unix() {
log.Error("arcCommercial launch time invalid. aid(%d)|orderID(%d)|gameBaseID(%d) beginDate(%+v)", aid, orderID, gameBaseID, beginDate)
err = ecode.NothingFound
return
}
cm = &archive.Commercial{}
cm.AID = a.Aid
cm.OrderID = orderID
cm.GameID = gameBaseID
} else if a.AttrVal(arcMdl.AttrBitIsPorder) == arcMdl.AttrYes {
// porder
var pd *archive.Porder
if pd, err = s.arc.Porder(c, aid); err != nil {
log.Error("arcCommercial aid(%d) error(%v)", aid, err)
err = ecode.NothingFound
return
}
if pd == nil {
log.Error("arcCommercial porder not show aid(%d)", aid)
err = ecode.CreativePorderForbidShowFront
return
}
cm = &archive.Commercial{}
cm.AID = a.Aid
cm.POrderID = pd.ID
cm.GameID = pd.BrandID
} else {
log.Error("arcCommercial is not commercial. aid(%d)|ip(%s)|", aid, ip)
err = ecode.NothingFound
return
}
return
}
// UpValidate func
func (s *Service) UpValidate(c context.Context, mid int64, ip string) (uv *order.UpValidate, err error) {
if uv, err = s.order.UpValidate(c, mid, ip); err != nil {
log.Error("s.order.UpValidate mid(%d)|ip(%s)|err(%v)", mid, ip, err)
}
return
}

View File

@@ -0,0 +1,44 @@
package archive
import (
"context"
"go-common/app/interface/main/creative/model/archive"
"go-common/library/log"
)
// Porder fn
func (s *Service) Porder(c context.Context, aid int64) (pd *archive.Porder, err error) {
log.Warn("Porder with aid (%+v)", aid)
cache := true
if pd, err = s.arc.POrderCache(c, aid); err != nil {
err = nil
cache = false
} else if pd != nil {
s.pCacheHit.Incr("porder_cache")
return
}
s.pCacheMiss.Incr("porder_cache")
if pd, err = s.arc.Porder(c, aid); err != nil {
log.Error("s.porder.Porder aid(%d) err(%v)", aid, err)
return
}
if cache {
s.addCache(func() {
if pd == nil {
pd = &archive.Porder{}
}
s.arc.AddPOrderCache(context.Background(), aid, pd)
})
}
return
}
// FlowJudge fn
func (s *Service) FlowJudge(c context.Context, business, groupID int64, oids []int64) (hitOids []int64, err error) {
if hitOids, err = s.arc.FlowJudge(c, business, groupID, oids); err != nil {
log.Error("s.porder.FlowJudge business(%d) groupID(%d) err(%v)", business, groupID, err)
return
}
return
}

View File

@@ -0,0 +1,113 @@
package archive
import (
"context"
a "go-common/app/admin/main/videoup/model/archive"
)
// EditRules fn
func (s *Service) EditRules(c context.Context, white int, state int8, lotteryBind bool) (rules map[string]bool) {
var (
exist bool
rulesByArcState = make(map[int8]map[string]bool)
)
groupAllCan := map[string]bool{
"tid": true,
"title": true,
"tag": true,
"desc": true,
"dynamic": true,
"del_video": true,
"elec": true,
"add_video": true,
"dtime": true,
"source": true,
"no_reprint": true,
"cover": true,
"copyright": true,
"mission_tag": true,
"bind_lottery": false,
}
groupAllForbid := map[string]bool{
"tid": false,
"title": false,
"tag": false,
"desc": false,
"dynamic": false,
"del_video": false,
"elec": false,
"add_video": false,
"dtime": false,
"source": false,
"no_reprint": false,
"cover": false,
"copyright": false,
"mission_tag": false,
"bind_lottery": false,
}
groupForbidTidAndCopyright := map[string]bool{
"tid": false,
"title": true,
"tag": true,
"desc": true,
"dynamic": true,
"del_video": true,
"elec": true,
"add_video": true,
"dtime": true,
"source": true,
"no_reprint": true,
"cover": true,
"copyright": false,
"mission_tag": false,
"bind_lottery": false,
}
groupForbidTidAndCopyrightDtime := map[string]bool{
"tid": false,
"title": true,
"tag": true,
"desc": true,
"dynamic": true,
"del_video": true,
"elec": true,
"add_video": true,
"dtime": false,
"source": true,
"no_reprint": true,
"cover": true,
"copyright": false,
"mission_tag": false,
"bind_lottery": false,
}
rulesByArcState[a.StateOrange] = groupForbidTidAndCopyrightDtime
rulesByArcState[a.StateOpen] = groupForbidTidAndCopyrightDtime
rulesByArcState[a.StateForbidWait] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidAdminDelay] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidSubmit] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidUserDelay] = groupForbidTidAndCopyrightDtime
rulesByArcState[a.StateForbidXcodeFail] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidPolice] = groupAllForbid
rulesByArcState[a.StateForbidLock] = groupAllForbid
rulesByArcState[a.StateForbidFackLock] = groupAllForbid
rulesByArcState[a.StateForbidUpDelete] = groupAllForbid
rulesByArcState[a.StateForbitUpLoad] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidOnlyComment] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidDispatch] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidFixing] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidStorageFail] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidWaitXcode] = groupForbidTidAndCopyright
rulesByArcState[a.StateForbidTmpRecicle] = groupAllCan
rulesByArcState[a.StateForbidRecycle] = groupAllCan
rulesByArcState[a.StateForbidFixed] = groupForbidTidAndCopyrightDtime
rulesByArcState[a.StateForbidLater] = groupForbidTidAndCopyrightDtime
rulesByArcState[a.StateForbidPatched] = groupForbidTidAndCopyrightDtime
if rules, exist = rulesByArcState[state]; exist {
if white == 0 {
rules["add_video"] = false
}
rules["bind_lottery"] = lotteryBind
}
return
}

View File

@@ -0,0 +1,144 @@
package archive
import (
"context"
"time"
"go-common/app/interface/main/creative/conf"
"go-common/app/interface/main/creative/dao/account"
"go-common/app/interface/main/creative/dao/activity"
"go-common/app/interface/main/creative/dao/appeal"
"go-common/app/interface/main/creative/dao/archive"
"go-common/app/interface/main/creative/dao/coin"
gD "go-common/app/interface/main/creative/dao/game"
"go-common/app/interface/main/creative/dao/order"
"go-common/app/interface/main/creative/dao/search"
"go-common/app/interface/main/creative/dao/tag"
"go-common/app/interface/main/creative/dao/template"
actmdl "go-common/app/interface/main/creative/model/activity"
"go-common/app/interface/main/creative/model/game"
"go-common/app/interface/main/creative/service"
"go-common/library/log"
"go-common/library/stat/prom"
)
//Service struct
type Service struct {
c *conf.Config
arc *archive.Dao
acc *account.Dao
sear *search.Dao
act *activity.Dao
tpl *template.Dao
coin *coin.Dao
order *order.Dao
ap *appeal.Dao
tag *tag.Dao
game *gD.Dao
p *service.Public
prom *prom.Prom
missch chan func()
pCacheHit *prom.Prom
pCacheMiss *prom.Prom
// cache
orderUps map[int64]int64
gameMap map[int64]*game.ListItem
ArcTip string
}
//New get service
func New(c *conf.Config, rpcdaos *service.RPCDaos, p *service.Public) *Service {
s := &Service{
c: c,
arc: rpcdaos.Arc,
acc: rpcdaos.Acc,
sear: search.New(c),
act: activity.New(c),
tpl: template.New(c),
tag: tag.New(c),
coin: coin.New(c),
order: order.New(c),
ap: appeal.New(c),
game: gD.New(c),
p: p,
prom: prom.BusinessInfoCount,
missch: make(chan func(), 1024),
pCacheHit: prom.CacheHit,
pCacheMiss: prom.CacheMiss,
ArcTip: c.Host.ArcTip,
}
s.loadOrderUps()
s.loadAllGameMap()
go s.loadproc()
go s.cacheproc()
return s
}
// TopAct fn
func (s *Service) TopAct() (ret []*actmdl.Activity) {
return s.p.TopActCache
}
func (s *Service) loadOrderUps() {
orderUps, err := s.order.Ups(context.TODO())
if err != nil {
return
}
s.orderUps = orderUps
}
func (s *Service) loadAllGameMap() {
list, err := s.game.List(context.TODO(), "", "")
if err != nil || list == nil || len(list) == 0 {
return
}
s.gameMap = make(map[int64]*game.ListItem)
for _, v := range list {
s.gameMap[v.GameBaseID] = v
}
log.Info("s.loadAllGameMap: s.gameMapLen(%d)", len(s.gameMap))
}
// loadproc
func (s *Service) loadproc() {
for {
time.Sleep(5 * time.Minute)
s.loadOrderUps()
s.loadAllGameMap()
}
}
// AllowOrderUps 检查用户商单信息
func (s *Service) AllowOrderUps(mid int64) (ok bool) {
_, ok = s.orderUps[mid]
return
}
// AddCache add to chan for cache
func (s *Service) addCache(f func()) {
select {
case s.missch <- f:
default:
log.Warn("cacheproc chan full")
}
}
// cacheproc is a routine for execute closure.
func (s *Service) cacheproc() {
for {
f := <-s.missch
f()
}
}
// Ping service
func (s *Service) Ping(c context.Context) (err error) {
if err = s.arc.Ping(c); err != nil {
log.Error("s.archive.Dao.PingDb err(%v)", err)
}
return
}
// Close dao
func (s *Service) Close() {
s.arc.Close()
}

View File

@@ -0,0 +1,175 @@
package archive
import (
"context"
"flag"
"fmt"
"path/filepath"
"testing"
"time"
"github.com/davecgh/go-spew/spew"
"go-common/app/interface/main/creative/conf"
arcmdl "go-common/app/interface/main/creative/model/archive"
"go-common/app/interface/main/creative/model/order"
"go-common/app/interface/main/creative/service"
. "github.com/smartystreets/goconvey/convey"
)
var (
s *Service
p *service.Public
)
func init() {
dir, _ := filepath.Abs("../../cmd/creative.toml")
flag.Set("conf", dir)
conf.Init()
rpcdaos := service.NewRPCDaos(conf.Conf)
p = service.New(conf.Conf, rpcdaos)
s = New(conf.Conf, rpcdaos, p)
time.Sleep(time.Second)
}
func WithService(f func(s *Service)) func() {
return func() {
Reset(func() {})
f(s)
}
}
func ctx() context.Context {
return context.Background()
}
func Test_Oasis(t *testing.T) {
Convey("should get user oasis info", t, func() {
res, err := s.Oasis(ctx(), 27515256, "127.0.0.1")
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}
func Test_Order(t *testing.T) {
var (
c = ctx()
err error
MID = int64(27515256)
orders []*order.Order
oasis *order.Oasis
)
Convey("ExecuteOrders", t, WithService(func(s *Service) {
orders, err = s.ExecuteOrders(c, MID, "127.0.0.1")
So(err, ShouldBeNil)
spew.Dump(orders)
}))
Convey("Oasis", t, WithService(func(s *Service) {
oasis, err = s.Oasis(c, MID, "127.0.0.1")
So(err, ShouldBeNil)
spew.Dump(oasis)
}))
}
func Test_ServiceBasic(t *testing.T) {
var (
c = context.Background()
err error
)
Convey("ServiceClose", t, WithService(func(s *Service) {
s.Close()
}))
Convey("Ping", t, WithService(func(s *Service) {
err = s.Ping(c)
So(err, ShouldBeNil)
}))
Convey("AppModuleShowMap", t, WithService(func(s *Service) {
var res map[string]bool
mid := int64(91513044)
res = s.AppModuleShowMap(mid, false)
So(res, ShouldNotBeNil)
}))
}
func Test_NetSafe(t *testing.T) {
var (
c = context.Background()
err error
nid int64
md5 string
)
nid = 123
md5 = "iamamd5string"
Convey("AddNetSafeMd5", t, WithService(func(s *Service) {
err = s.AddNetSafeMd5(c, nid, md5)
So(err, ShouldBeNil)
}))
Convey("NotifyNetSafe", t, WithService(func(s *Service) {
err = s.NotifyNetSafe(c, nid)
So(err, ShouldBeNil)
}))
}
func Test_DescFormat(t *testing.T) {
var (
c = context.Background()
err error
typeid, copyright int64
langStr, ip string
desc *arcmdl.DescFormat
af []*arcmdl.AppFormat
length int
)
Convey("DescFormat", t, WithService(func(s *Service) {
desc, err = s.DescFormat(c, typeid, copyright, langStr, ip)
So(err, ShouldBeNil)
So(desc, ShouldNotBeNil)
}))
Convey("DescFormatForApp", t, WithService(func(s *Service) {
desc, length, err = s.DescFormatForApp(c, typeid, copyright, langStr, ip)
So(err, ShouldBeNil)
So(desc, ShouldNotBeNil)
So(length, ShouldNotBeNil)
So(length, ShouldBeGreaterThanOrEqualTo, 0)
}))
Convey("AppFormats", t, WithService(func(s *Service) {
af, err = s.AppFormats(c)
So(err, ShouldBeNil)
So(af, ShouldNotBeNil)
So(len(af), ShouldBeGreaterThanOrEqualTo, 0)
}))
}
func Test_Arc(t *testing.T) {
var (
c = context.Background()
err error
mid, aid int64
ak, ck, ip = "", "", ""
ap *arcmdl.SimpleArchiveVideos
)
Convey("SimpleArchiveVideos", t, WithService(func(s *Service) {
ap, err = s.SimpleArchiveVideos(c, mid, aid, ak, ck, ip)
So(err, ShouldBeNil)
So(ap, ShouldNotBeNil)
}))
}
func TestArchiveBIZsByTime(t *testing.T) {
Convey("BIZsByTime", t, WithService(func(s *Service) {
var (
c = context.Background()
start = time.Unix(1544000000, 0)
end = time.Unix(1544008000, 0)
tp = int8(2)
)
// mock bizs
Convey("When everything gose positive", WithService(func(s *Service) {
bizs, err := s.BIZsByTime(c, &start, &end, tp)
Convey("Then err should be nil.bizs should not be nil.", func(ctx C) {
So(err, ShouldBeNil)
So(bizs, ShouldNotBeNil)
fmt.Println(bizs[0])
})
}))
}))
}

View File

@@ -0,0 +1,15 @@
package archive
import (
"context"
)
// StaffApplySubmit fn
func (s *Service) StaffApplySubmit(c context.Context, id, aid, mid, state, atype int64, flagAddBlack, flagRefuse int) (err error) {
return s.arc.StaffApplySubmit(c, id, aid, mid, state, atype, flagAddBlack, flagRefuse)
}
// StaffValidate func
func (s *Service) StaffValidate(c context.Context, mid int64) (uv int, err error) {
return s.arc.StaffMidValidate(c, mid)
}

View File

@@ -0,0 +1,38 @@
package archive
import (
"context"
"go-common/app/interface/main/creative/model/tag"
"go-common/library/ecode"
"go-common/library/log"
)
// TagCheck fn
func (s *Service) TagCheck(c context.Context, mid int64, tagName string) (code int, msg string) {
var (
err error
t *tag.Tag
)
for _, act := range s.p.ActVideoAllCache {
if act.Tags == tagName {
code = 1
msg = "当前tag为活动专用不允许自定义添加请先删除之后重选对应的活动"
return
}
}
if t, err = s.tag.TagCheck(c, mid, tagName); err != nil {
log.Error("s.tag.TagCheck mid(%d)|tagName(%s)|err(%v)", mid, tagName, err)
code = 1
msg = ecode.String(err.Error()).Message()
return
}
if t != nil && (t.State == tag.TagStateDel ||
t.State == tag.TagStateHide ||
t.Type == tag.OfficailActiveTag) {
code = 1
msg = "非法Tag不允许Up主使用"
return
}
return
}

View File

@@ -0,0 +1,32 @@
package archive
import (
"context"
"go-common/app/interface/main/creative/model/archive"
"go-common/library/ecode"
"go-common/library/log"
)
// VideoPoints 获取视频最新生效的高能看点
func (s *Service) VideoPoints(c context.Context, aid, cid int64) (vp *archive.ViewPointRow, err error) {
vp, err = s.arc.ViewPoint(c, aid, cid)
return
}
// WebViewPoints 创作中心高能看点接口
func (s *Service) WebViewPoints(c context.Context, aid, cid, mid int64, ip string) (vps []*archive.ViewPointRow, err error) {
a, err := s.arc.Archive(c, aid, ip)
if err != nil {
return
}
if a.Author.Mid != mid {
err = ecode.AccessDenied
log.Error("WebViewPoints() wrong auth. Login mid(%d) archive mid(%d)", mid, a.Author.Mid)
return
}
if vps, err = s.arc.RawViewPoints(c, aid, cid, 3); err != nil {
log.Error("s.arc.RawViewPoints(%d,%d) error(%v)", aid, cid, err)
return
}
return
}