archive.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. package service
  2. import (
  3. "context"
  4. "html/template"
  5. "time"
  6. "go-common/app/interface/main/space/model"
  7. arcmdl "go-common/app/service/main/archive/api"
  8. filmdl "go-common/app/service/main/filter/model/rpc"
  9. upmdl "go-common/app/service/main/up/api/v1"
  10. "go-common/library/ecode"
  11. "go-common/library/log"
  12. "go-common/library/sync/errgroup.v2"
  13. )
  14. const (
  15. _reasonWarnLevel = int8(20)
  16. _reasonErrLevel = int8(30)
  17. _checkTypeChannel = "channel"
  18. )
  19. var (
  20. _emptyArchiveReason = make([]*model.ArchiveReason, 0)
  21. _emptySearchVList = make([]*model.SearchVList, 0)
  22. )
  23. // UpArcStat get up all article stat.
  24. func (s *Service) UpArcStat(c context.Context, mid int64) (data *model.UpArcStat, err error) {
  25. addCache := true
  26. if data, err = s.dao.UpArcCache(c, mid); err != nil {
  27. addCache = false
  28. } else if data != nil {
  29. return
  30. }
  31. dt := time.Now().AddDate(0, 0, -1).Add(-12 * time.Hour).Format("20060102")
  32. if data, err = s.dao.UpArcStat(c, mid, dt); data != nil && addCache {
  33. s.cache.Do(c, func(c context.Context) {
  34. s.dao.SetUpArcCache(c, mid, data)
  35. })
  36. }
  37. return
  38. }
  39. // TopArc get top archive.
  40. func (s *Service) TopArc(c context.Context, mid, vmid int64) (res *model.ArchiveReason, err error) {
  41. var (
  42. topArc *model.AidReason
  43. arcReply *arcmdl.ArcReply
  44. )
  45. if topArc, err = s.dao.TopArc(c, vmid); err != nil {
  46. return
  47. }
  48. if topArc == nil || topArc.Aid == 0 {
  49. err = ecode.SpaceNoTopArc
  50. return
  51. }
  52. if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: topArc.Aid}); err != nil {
  53. log.Error("TopArc s.arcClient.Arc(%d) error(%v)", topArc.Aid, err)
  54. return
  55. }
  56. arc := arcReply.Arc
  57. if mid != vmid && !arc.IsNormal() {
  58. err = ecode.SpaceNoTopArc
  59. return
  60. }
  61. if arc.Access >= 10000 {
  62. arc.Stat.View = -1
  63. }
  64. res = &model.ArchiveReason{Arc: arc, Reason: template.HTMLEscapeString(topArc.Reason)}
  65. return
  66. }
  67. // SetTopArc set top archive.
  68. func (s *Service) SetTopArc(c context.Context, mid, aid int64, reason string) (err error) {
  69. var (
  70. arcReply *arcmdl.ArcReply
  71. filRes *filmdl.FilterRes
  72. topArc *model.AidReason
  73. )
  74. if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
  75. log.Error("SetTopArc s.arcClient.Arc(%d) error(%v)", aid, err)
  76. return
  77. }
  78. arc := arcReply.Arc
  79. if !arc.IsNormal() {
  80. err = ecode.SpaceFakeAid
  81. return
  82. }
  83. if arc.Author.Mid != mid {
  84. err = ecode.SpaceNotAuthor
  85. return
  86. }
  87. if reason != "" {
  88. if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
  89. log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
  90. return
  91. }
  92. if filRes.Level >= _reasonErrLevel {
  93. err = ecode.SpaceTextBanned
  94. return
  95. }
  96. if filRes.Level == _reasonWarnLevel {
  97. reason = filRes.Result
  98. }
  99. }
  100. if topArc, err = s.dao.TopArc(c, mid); err != nil {
  101. return
  102. }
  103. if topArc != nil && aid == topArc.Aid && reason == topArc.Reason {
  104. err = ecode.NotModified
  105. return
  106. }
  107. if err = s.dao.AddTopArc(c, mid, aid, reason); err == nil {
  108. s.dao.AddCacheTopArc(c, mid, &model.AidReason{Aid: aid, Reason: reason})
  109. }
  110. return
  111. }
  112. // DelTopArc delete top archive.
  113. func (s *Service) DelTopArc(c context.Context, mid int64) (err error) {
  114. var topArc *model.AidReason
  115. if topArc, err = s.dao.TopArc(c, mid); err != nil {
  116. return
  117. }
  118. if topArc == nil {
  119. err = ecode.RequestErr
  120. return
  121. }
  122. if err = s.dao.DelTopArc(c, mid); err == nil {
  123. s.dao.AddCacheTopArc(c, mid, &model.AidReason{Aid: -1})
  124. }
  125. return
  126. }
  127. // Masterpiece get masterpiece.
  128. func (s *Service) Masterpiece(c context.Context, mid, vmid int64) (res []*model.ArchiveReason, err error) {
  129. var (
  130. mps *model.AidReasons
  131. arcsReply *arcmdl.ArcsReply
  132. aids []int64
  133. )
  134. if mps, err = s.dao.Masterpiece(c, vmid); err != nil {
  135. return
  136. }
  137. if mps == nil || len(mps.List) == 0 {
  138. res = _emptyArchiveReason
  139. return
  140. }
  141. for _, v := range mps.List {
  142. aids = append(aids, v.Aid)
  143. }
  144. if arcsReply, err = s.arcClient.Arcs(c, &arcmdl.ArcsRequest{Aids: aids}); err != nil {
  145. log.Error("Masterpiece s.arcClient.Arcs(%v) error(%v)", aids, err)
  146. return
  147. }
  148. for _, v := range mps.List {
  149. if arc, ok := arcsReply.Arcs[v.Aid]; ok && arc != nil {
  150. if !arc.IsNormal() && mid != vmid {
  151. continue
  152. }
  153. if arc.Access >= 10000 {
  154. arc.Stat.View = -1
  155. }
  156. res = append(res, &model.ArchiveReason{Arc: arc, Reason: template.HTMLEscapeString(v.Reason)})
  157. }
  158. }
  159. if len(res) == 0 {
  160. res = _emptyArchiveReason
  161. }
  162. return
  163. }
  164. // AddMasterpiece add masterpiece.
  165. func (s *Service) AddMasterpiece(c context.Context, mid, aid int64, reason string) (err error) {
  166. var (
  167. mps *model.AidReasons
  168. arcReply *arcmdl.ArcReply
  169. filRes *filmdl.FilterRes
  170. )
  171. if mps, err = s.dao.Masterpiece(c, mid); err != nil {
  172. return
  173. }
  174. if mps == nil {
  175. mps = &model.AidReasons{}
  176. }
  177. mpLen := len(mps.List)
  178. if mpLen >= s.c.Rule.MaxMpLimit {
  179. err = ecode.SpaceMpMaxCount
  180. return
  181. }
  182. if mpLen > 0 {
  183. for _, v := range mps.List {
  184. if v.Aid == aid {
  185. err = ecode.SpaceMpExist
  186. return
  187. }
  188. }
  189. }
  190. if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
  191. log.Error("AddMasterpiece s.arcClient.Arc(%d) error(%v)", aid, err)
  192. return
  193. }
  194. arc := arcReply.Arc
  195. if !arc.IsNormal() {
  196. err = ecode.SpaceFakeAid
  197. return
  198. }
  199. if arc.Author.Mid != mid {
  200. err = ecode.SpaceNotAuthor
  201. return
  202. }
  203. if reason != "" {
  204. if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
  205. log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
  206. return
  207. }
  208. if filRes.Level >= _reasonErrLevel {
  209. err = ecode.SpaceTextBanned
  210. return
  211. }
  212. if filRes.Level == _reasonWarnLevel {
  213. reason = filRes.Result
  214. }
  215. }
  216. if err = s.dao.AddMasterpiece(c, mid, aid, reason); err == nil {
  217. mps.List = append(mps.List, &model.AidReason{Aid: aid, Reason: reason})
  218. s.cache.Do(c, func(c context.Context) {
  219. s.dao.AddCacheMasterpiece(c, mid, mps)
  220. })
  221. }
  222. return
  223. }
  224. // EditMasterpiece edit masterpiece.
  225. func (s *Service) EditMasterpiece(c context.Context, mid, preAid, aid int64, reason string) (err error) {
  226. var (
  227. mps *model.AidReasons
  228. arcReply *arcmdl.ArcReply
  229. filRes *filmdl.FilterRes
  230. preCheck bool
  231. )
  232. if mps, err = s.dao.Masterpiece(c, mid); err != nil {
  233. return
  234. }
  235. if mps == nil || len(mps.List) == 0 {
  236. err = ecode.SpaceMpNoArc
  237. return
  238. }
  239. for _, v := range mps.List {
  240. if v.Aid == preAid {
  241. preCheck = true
  242. }
  243. if v.Aid == aid {
  244. err = ecode.SpaceMpExist
  245. return
  246. }
  247. }
  248. if !preCheck {
  249. err = ecode.SpaceMpNoArc
  250. return
  251. }
  252. if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
  253. log.Error("AddMasterpiece s.arcClient.Arc(%d) error(%v)", aid, err)
  254. return
  255. }
  256. arc := arcReply.Arc
  257. if !arc.IsNormal() {
  258. err = ecode.SpaceFakeAid
  259. return
  260. }
  261. if arc.Author.Mid != mid {
  262. err = ecode.SpaceNotAuthor
  263. return
  264. }
  265. if reason != "" {
  266. if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
  267. log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
  268. return
  269. }
  270. if filRes.Level >= _reasonErrLevel {
  271. err = ecode.SpaceTextBanned
  272. return
  273. }
  274. if filRes.Level == _reasonWarnLevel {
  275. reason = filRes.Result
  276. }
  277. }
  278. if err = s.dao.EditMasterpiece(c, mid, aid, preAid, reason); err == nil {
  279. newAidReasons := &model.AidReasons{}
  280. for _, v := range mps.List {
  281. if v.Aid == preAid {
  282. newAidReasons.List = append(newAidReasons.List, &model.AidReason{Aid: aid, Reason: reason})
  283. } else {
  284. newAidReasons.List = append(newAidReasons.List, v)
  285. }
  286. }
  287. s.cache.Do(c, func(c context.Context) {
  288. s.dao.AddCacheMasterpiece(c, mid, newAidReasons)
  289. })
  290. }
  291. return
  292. }
  293. // CancelMasterpiece delete masterpiece.
  294. func (s *Service) CancelMasterpiece(c context.Context, mid, aid int64) (err error) {
  295. var (
  296. mps *model.AidReasons
  297. existCheck bool
  298. )
  299. if mps, err = s.dao.Masterpiece(c, mid); err != nil {
  300. return
  301. }
  302. if mps == nil || len(mps.List) == 0 {
  303. err = ecode.SpaceMpNoArc
  304. return
  305. }
  306. for _, v := range mps.List {
  307. if v.Aid == aid {
  308. existCheck = true
  309. break
  310. }
  311. }
  312. if !existCheck {
  313. err = ecode.SpaceMpNoArc
  314. return
  315. }
  316. if err = s.dao.DelMasterpiece(c, mid, aid); err == nil {
  317. newAidReasons := &model.AidReasons{}
  318. for _, v := range mps.List {
  319. if v.Aid == aid {
  320. continue
  321. }
  322. newAidReasons.List = append(newAidReasons.List, v)
  323. }
  324. if len(newAidReasons.List) == 0 {
  325. newAidReasons.List = append(newAidReasons.List, &model.AidReason{Aid: -1})
  326. }
  327. s.cache.Do(c, func(c context.Context) {
  328. s.dao.AddCacheMasterpiece(c, mid, newAidReasons)
  329. })
  330. }
  331. return
  332. }
  333. // UpArcs get upload archive .
  334. func (s *Service) UpArcs(c context.Context, mid int64, pn, ps int32) (res *model.UpArc, err error) {
  335. res = &model.UpArc{List: []*model.ArcItem{}}
  336. group := errgroup.WithContext(c)
  337. group.Go(func(ctx context.Context) error {
  338. if upCount, e := s.upClient.UpCount(ctx, &upmdl.UpCountReq{Mid: mid}); e != nil {
  339. log.Error("UpArcs s.upClient.UpCount mid(%d) error(%v)", mid, e)
  340. } else {
  341. res.Count = upCount.Count
  342. }
  343. return nil
  344. })
  345. group.Go(func(ctx context.Context) error {
  346. if reply, e := s.upClient.UpArcs(ctx, &upmdl.UpArcsReq{Mid: mid, Pn: pn, Ps: ps}); e != nil {
  347. log.Error("UpArcs s.upClient.UpArcs mid(%d) error(%v)", mid, err)
  348. } else if len(reply.Archives) > 0 {
  349. res.List = make([]*model.ArcItem, 0, len(reply.Archives))
  350. for _, v := range reply.Archives {
  351. si := &model.ArcItem{}
  352. si.FromArc(v)
  353. res.List = append(res.List, si)
  354. }
  355. }
  356. return nil
  357. })
  358. if e := group.Wait(); e != nil {
  359. log.Error("UpArcs group.Wait mid(%d) error(%v)", mid, e)
  360. }
  361. return
  362. }
  363. // ArcSearch get archive from search.
  364. func (s *Service) ArcSearch(c context.Context, mid int64, arg *model.SearchArg) (data *model.SearchRes, total int, err error) {
  365. if data, total, err = s.dao.ArcSearchList(c, arg); err != nil {
  366. return
  367. }
  368. if len(data.VList) == 0 {
  369. data.VList = _emptySearchVList
  370. return
  371. }
  372. checkAids := make(map[int64]int64)
  373. if arg.CheckType == _checkTypeChannel {
  374. if mid == 0 {
  375. err = ecode.RequestErr
  376. return
  377. }
  378. var chArcs []*model.ChannelArc
  379. if chArcs, err = s.dao.ChannelVideos(c, mid, arg.CheckID, false); err != nil {
  380. err = nil
  381. } else {
  382. for _, chArc := range chArcs {
  383. checkAids[chArc.Aid] = chArc.Aid
  384. }
  385. }
  386. }
  387. vlist := make([]*model.SearchVList, 0)
  388. for _, v := range data.VList {
  389. if v.HideClick {
  390. v.Play = "--"
  391. }
  392. if _, ok := checkAids[v.Aid]; !ok {
  393. vlist = append(vlist, v)
  394. }
  395. }
  396. data.VList = vlist
  397. return
  398. }