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,22 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/web-room/api/http/v1:all-srcs",
"//app/interface/live/web-room/cmd:all-srcs",
"//app/interface/live/web-room/conf:all-srcs",
"//app/interface/live/web-room/dao:all-srcs",
"//app/interface/live/web-room/model:all-srcs",
"//app/interface/live/web-room/server/http:all-srcs",
"//app/interface/live/web-room/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,6 @@
# v1.0.0
1. 提供一个替换接口迁移原app-web/i/api/ajaxGetAdmin接口
# v1.1.2
1. 传递roomid至验证码服务

View File

@@ -0,0 +1,7 @@
# Owner
yangbaibing
# Author
wujunchen
# Reviewer

View File

@@ -0,0 +1,13 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- wujunchen
- yangbaibing
labels:
- interface
- interface/live/web-room
- live
options:
no_parent_owners: true
reviewers:
- wujunchen

View File

@@ -0,0 +1,12 @@
# web-room-interface
# 项目简介
1.
# 编译环境
# 依赖包
# 编译执行

View File

@@ -0,0 +1 @@
# HTTP API文档

View File

@@ -0,0 +1,64 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v1_proto",
srcs = [
"captcha.proto",
"dm.proto",
"roomAdmin.proto",
],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v1_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/web-room/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"captcha.bm.go",
"dm.bm.go",
"roomAdmin.bm.go",
],
embed = [":v1_go_proto"],
importpath = "go-common/app/interface/live/web-room/api/http/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto: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,71 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/captcha.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/captcha.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
// =================
// Captcha Interface
// =================
// captcha 相关服务
type Captcha interface {
// 创建验证码 `midware:"auth"`
Create(ctx context.Context, req *CreateCaptchaReq) (resp *CreateCaptchaResp, err error)
// 校验接口 `midware:"auth" method:"POST"`
Verify(ctx context.Context, req *VerifyReq) (resp *VerifyResp, err error)
}
var v1CaptchaSvc Captcha
// @params CreateCaptchaReq
// @router GET /xlive/web-room/v1/captcha/create
// @response CreateCaptchaResp
func captchaCreate(c *bm.Context) {
p := new(CreateCaptchaReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CaptchaSvc.Create(c, p)
c.JSON(resp, err)
}
// @params VerifyReq
// @router POST /xlive/web-room/v1/captcha/verify
// @response VerifyResp
func captchaVerify(c *bm.Context) {
p := new(VerifyReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CaptchaSvc.Verify(c, p)
c.JSON(resp, err)
}
// RegisterV1CaptchaService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1CaptchaService(e *bm.Engine, svc Captcha, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
v1CaptchaSvc = svc
e.GET("/xlive/web-room/v1/captcha/create", auth, captchaCreate)
e.POST("/xlive/web-room/v1/captcha/verify", auth, captchaVerify)
}

View File

@@ -0,0 +1,55 @@
##
> 需要登录
`GET http://api.live.bilibili.com/xlive/web-room/v1/captcha/create`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|type|否|integer||
|client_type|否|string||
|height|否|integer||
|width|否|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
"type": 0,
"geetest": {
"gt": "",
"challenge": ""
},
"image": {
"tips": "",
"token": "",
"content": ""
}
}
}
```
##
> 需要登录
`POST http://api.live.bilibili.com/xlive/web-room/v1/captcha/verify`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|anti|否|string||
```json
{
"code": 0,
"message": "ok",
"data": {
"type": 0,
"token": ""
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
syntax = "proto3";
package live.webroom.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// captcha 相关服务
service Captcha {
// 创建验证码 `midware:"auth"`
rpc create (CreateCaptchaReq) returns (CreateCaptchaResp);
// 校验接口 `midware:"auth" method:"POST"`
rpc verify (VerifyReq) returns (VerifyResp);
}
message CreateCaptchaReq {
int64 type = 1 [(gogoproto.moretags) = 'form:"type"'];
string client_type = 2 [(gogoproto.moretags) = 'form:"client_type"'];
int64 height = 3 [(gogoproto.moretags) = 'form:"height"'];
int64 width = 4 [(gogoproto.moretags) = 'form:"width"'];
}
message CreateCaptchaResp{
int64 type = 1 [(gogoproto.jsontag) = "type"];
GeeTest geetest = 2 [(gogoproto.jsontag) = "geetest"];
Image image = 3 [(gogoproto.jsontag) = "image"];
}
message GeeTest{
string gt = 1 [(gogoproto.jsontag) = "gt"];
string challenge = 2 [(gogoproto.jsontag) = "challenge"];
}
message Image{
string tips = 1 [(gogoproto.jsontag) = "tips"];
string token = 2 [(gogoproto.jsontag) = "token"];
string content = 3 [(gogoproto.jsontag) = "content"];
}
message VerifyReq{
string anti = 1 [(gogoproto.moretags) = 'form:"anti"'];
}
message VerifyResp{
int64 type = 1 [(gogoproto.jsontag) = "type"];
string token = 2 [(gogoproto.jsontag) = "token"];
}

View File

@@ -0,0 +1,69 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/dm.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/dm.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
// ============
// DM Interface
// ============
type DM interface {
// `method:"POST"`
SendMsg(ctx context.Context, req *SendDMReq) (resp *SendMsgResp, err error)
// `method:"POST"`
GetHistory(ctx context.Context, req *HistoryReq) (resp *HistoryResp, err error)
}
var v1DMSvc DM
// @params SendDMReq
// @router POST /xlive/web-room/v1/dM/SendMsg
// @response SendMsgResp
func dMSendMsg(c *bm.Context) {
p := new(SendDMReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1DMSvc.SendMsg(c, p)
c.JSON(resp, err)
}
// @params HistoryReq
// @router POST /xlive/web-room/v1/dM/GetHistory
// @response HistoryResp
func dMGetHistory(c *bm.Context) {
p := new(HistoryReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1DMSvc.GetHistory(c, p)
c.JSON(resp, err)
}
// RegisterV1DMService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1DMService(e *bm.Engine, svc DM, midMap map[string]bm.HandlerFunc) {
v1DMSvc = svc
e.POST("/xlive/web-room/v1/dM/SendMsg", dMSendMsg)
e.POST("/xlive/web-room/v1/dM/GetHistory", dMGetHistory)
}

View File

@@ -0,0 +1,51 @@
##
`POST http://api.live.bilibili.com/xlive/web-room/v1/dM/SendMsg`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|roomid|是|integer||
|msg|是|string||
|rnd|是|string||
|fontsize|是|integer||
|mode|否|integer||
|color|是|integer||
|bubble|否|integer||
|anti|否|string||
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```
##
`POST http://api.live.bilibili.com/xlive/web-room/v1/dM/GetHistory`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|roomid|是|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
"Room": [
""
],
"Admin": [
""
]
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
syntax = "proto3";
package live.webroom.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
message SendDMReq {
int64 roomid = 1 [(gogoproto.moretags) = 'form:"roomid" validate:"required"'];
string msg = 2 [(gogoproto.moretags) = 'form:"msg" validate:"required"'];
string rnd = 3 [(gogoproto.moretags) = 'form:"rnd" validate:"required"'];
int64 fontsize = 4 [(gogoproto.moretags) = 'form:"fontsize" validate:"required"'];
int64 mode = 5 [(gogoproto.moretags) = 'form:"mode" validate:"gte=0"'];
int64 color = 6 [(gogoproto.moretags) = 'form:"color" validate:"required"'];
int64 bubble = 7 [(gogoproto.moretags) = 'form:"bubble"'];
string anti = 9 [(gogoproto.moretags) = 'form:"_anti"'];
}
message SendMsgResp {
}
message HistoryReq {
int64 roomid = 1 [(gogoproto.moretags) = 'form:"roomid" validate:"required"'];
}
message HistoryResp {
repeated string Room = 1;
repeated string Admin = 2;
}
service DM{
// `method:"POST"`
rpc SendMsg(SendDMReq) returns (SendMsgResp);
// `method:"POST"`
rpc GetHistory(HistoryReq) returns (HistoryResp);
}

View File

@@ -0,0 +1,55 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/roomAdmin.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/roomAdmin.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
// ===================
// RoomAdmin Interface
// ===================
// History 相关服务
type RoomAdmin interface {
// 获取主播拥有的的所有房管, 无需登录态
// `method:"GET"
GetByRoom(ctx context.Context, req *RoomAdminGetByRoomReq) (resp *RoomAdminGetByRoomResp, err error)
}
var v1RoomAdminSvc RoomAdmin
// @params RoomAdminGetByRoomReq
// @router GET /xlive/web-room/v1/roomAdmin/get_by_room
// @response RoomAdminGetByRoomResp
func roomAdminGetByRoom(c *bm.Context) {
p := new(RoomAdminGetByRoomReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RoomAdminSvc.GetByRoom(c, p)
c.JSON(resp, err)
}
// RegisterV1RoomAdminService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1RoomAdminService(e *bm.Engine, svc RoomAdmin, midMap map[string]bm.HandlerFunc) {
v1RoomAdminSvc = svc
e.GET("/xlive/web-room/v1/roomAdmin/get_by_room", roomAdminGetByRoom)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
syntax = "proto3";
package live.webroom.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// History 相关服务
service RoomAdmin {
// 获取主播拥有的的所有房管, 无需登录态
// `method:"GET"
rpc get_by_room (RoomAdminGetByRoomReq) returns (RoomAdminGetByRoomResp);
}
message RoomAdminGetByRoomReq {
// 页数
int64 page = 1 [(gogoproto.moretags) = 'form:"page"'];
// 房间号
int64 roomid = 2 [(gogoproto.moretags) = 'form:"roomid" validate:"required"'];
// 每页数量
int64 page_size = 3 [(gogoproto.moretags) = 'form:"page_size"'];
}
message RoomAdminGetByRoomResp {
//
Page page = 1;
//
repeated Data data = 2 [(gogoproto.jsontag) = "data"];
message Data {
// 用户id
int64 uid = 3 [(gogoproto.jsontag) = "uid"];
// 用户名
string uname = 4 [(gogoproto.jsontag) = "uname"];
// 用户头像
string face = 5 [(gogoproto.jsontag) = "face"];
// 上任时间
string ctime = 6 [(gogoproto.jsontag) = "ctime"];
}
message Page {
// 当前页码
int64 page = 1;
// 每页大小
int64 page_size = 2;
// 总页数
int64 total_page = 3;
// 总记录数
int64 total_count = 4;
}
}

View File

@@ -0,0 +1,44 @@
## 获取主播拥有的的所有房管, 无需登录态
`method:"GET"
`GET http://api.live.bilibili.com/xlive/web-room/v1/roomAdmin/get_by_room`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|否|integer| 页数|
|roomid|是|integer| 房间号|
|page_size|否|integer| 每页数量|
```json
{
"code": 0,
"message": "ok",
"data": {
"page": {
// 当前页码
"page": 0,
// 每页大小
"page_size": 0,
// 总页数
"total_page": 0,
// 总记录数
"total_count": 0
},
"data": [
{
// 用户id
"uid": 0,
// 用户名
"uname": "",
// 用户头像
"face": "",
// 上任时间
"ctime": ""
}
]
}
}
```

View File

@@ -0,0 +1,44 @@
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 = ["test.toml"],
importpath = "go-common/app/interface/live/web-room/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/server/http:go_default_library",
"//app/interface/live/web-room/service: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,47 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/interface/live/web-room/conf"
"go-common/app/interface/live/web-room/server/http"
"go-common/app/interface/live/web-room/service"
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 {
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("web-room-interface start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
ecode.Init(conf.Conf.Ecode)
svc := service.New(conf.Conf)
http.Init(conf.Conf)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
svc.Close()
log.Info("web-room-interface exit")
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,21 @@
[log]
# dir = "/data/log/web-room"
stdout = true
# family = "live.live.web-room"
# [log.agent]
# taskID = "000161"
# proto = "unixgram"
# addr = "/var/run/lancer/collector.sock"
# chan = 10240
[DMsend]
taskID = "582"
proto = "tcp"
addr = "172.18.33.125:15140"
chanSize = 10240
[DMerr]
taskID = "1409"
proto = "tcp"
addr = "172.18.33.125:15140"
chanSize = 10240

View File

@@ -0,0 +1,43 @@
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/live/web-room/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/cache/redis:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode/tip: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/verify:go_default_library",
"//library/net/rpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace: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,98 @@
package conf
import (
"errors"
"flag"
"go-common/library/cache/memcache"
"go-common/library/cache/redis"
"go-common/library/conf"
"go-common/library/database/sql"
ecode "go-common/library/ecode/tip"
"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/verify"
"go-common/library/net/rpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
)
var (
confPath string
client *conf.Client
// Conf config
Conf = &Config{}
)
// Config .
type Config struct {
Log *log.Config
BM *bm.ServerConfig
Verify *verify.Config
Tracer *trace.Config
Redis *redis.Config
Memcache *memcache.Config
MySQL *sql.Config
Ecode *ecode.Config
AuthN *auth.Config
DM *warden.ClientConfig
Risk *warden.ClientConfig
VerifyConf *warden.ClientConfig
XCaptcha *warden.ClientConfig
XRoomAdmin *warden.ClientConfig
AccountRPC *rpc.ClientConfig
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init conf
func Init() error {
if confPath != "" {
return local()
}
return remote()
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
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,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"roomAdmin.go",
],
importpath = "go-common/app/interface/live/web-room/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/service/live/xuser/api/grpc/v1:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/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 dao
import (
"context"
accrpc "go-common/app/service/main/account/rpc/client"
"go-common/app/interface/live/web-room/conf"
"go-common/app/service/live/xuser/api/grpc/v1"
)
// Dao dao
type Dao struct {
c *conf.Config
RoomAdminAPI v1.RoomAdminClient
acc *accrpc.Service3
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
roomAdminClient, err := v1.NewXuserRoomAdminClient(conf.Conf.XRoomAdmin)
if err != nil {
panic(err)
}
dao = &Dao{
c: c,
RoomAdminAPI: roomAdminClient,
acc: accrpc.New3(c.AccountRPC),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
return nil
}

View File

@@ -0,0 +1,101 @@
package dao
import (
"context"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/service/live/xuser/api/grpc/v1"
account "go-common/app/service/main/account/model"
"go-common/library/log"
"math"
)
// GetByRoomIDPage get roomadmin list by roomid.
func (d *Dao) GetByRoomIDPage(c context.Context, roomID int64, page int64, pageSize int64) (resp *v1pb.RoomAdminGetByRoomResp, err error) {
resp = &v1pb.RoomAdminGetByRoomResp{}
resp.Page = &v1pb.RoomAdminGetByRoomResp_Page{
Page: page,
PageSize: pageSize,
TotalPage: 1,
TotalCount: 0,
}
ret, err := d.RoomAdminAPI.GetByRoom(c, &v1.RoomAdminGetByRoomReq{
Roomid: roomID,
})
log.Info("call GetByAnchor mid(%v) page (%v) ret(%v)", roomID, page, ret)
if err != nil {
log.Error("call GetByAnchor mid(%v) page (%v) error(%v)", roomID, page, err)
return
}
if ret == nil || ret.Data == nil {
return
}
mids, _ := d.getUidsFromAdmins(c, ret.Data)
dataLen := int64(len(mids))
d.setPager(dataLen, pageSize, page, resp.Page)
begin, end := d.getRange(pageSize, page, dataLen)
args := &account.ArgMids{Mids: mids[begin:end]}
accData, err := d.acc.Infos3(c, args)
if err != nil {
log.Error("call account.Infos3(%v) error(%v)", args, err)
return resp, err
}
for _, v := range ret.Data[begin:end] {
item := &v1pb.RoomAdminGetByRoomResp_Data{
Uid: v.Uid,
Ctime: v.Ctime,
}
if _, ok := accData[item.Uid]; ok {
item.Face = accData[item.Uid].Face
item.Uname = accData[item.Uid].Name
} else {
log.Error("没有这个人的用户信息 uid(%v) data(%v)", item.Uid, accData)
}
resp.Data = append(resp.Data, item)
}
return
}
// getAnchorUidsFromAdmins .
// 根据批量房管获取对应主播的房间号和UID
func (d *Dao) getUidsFromAdmins(c context.Context, admins []*v1.RoomAdminGetByRoomResp_Data) (uids []int64, err error) {
if len(admins) == 0 {
return
}
for _, r := range admins {
uids = append(uids, r.Uid)
}
return
}
// pageSize, page, dataLen
func (d *Dao) getRange(pageSize int64, page int64, dataLen int64) (begin int64, end int64) {
begin = (page - 1) * pageSize
end = page * pageSize
if end > dataLen {
end = dataLen
}
if begin > end {
begin = end
}
return
}
func (d *Dao) setPager(dataLen int64, pageSize int64, page int64, pager *v1pb.RoomAdminGetByRoomResp_Page) {
pager.Page = page
pager.TotalCount = dataLen
pager.TotalPage = int64(math.Ceil(float64(dataLen) / float64(pageSize)))
pager.PageSize = pageSize
}

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 = ["model.go"],
importpath = "go-common/app/interface/live/web-room/model",
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,22 @@
package model
//History 存档信息
type History struct {
Text string `json:"text"`
NickName string `json:"nickname"`
UnameColor string `json:"uname_color"`
UID int64 `json:"uid"`
TimeLine string `json:"timeline"`
Isadmin int32 `json:"isadmin"`
Vip int `json:"vip"`
SVip int `json:"svip"`
Medal []interface{} `json:"medal"`
Title []interface{} `json:"title"`
UserLevel []interface{} `json:"user_level"`
Rank int32 `json:"rank"`
Teamid int64 `json:"teamid"`
RND string `json:"rnd"`
UserTitle string `json:"user_title"`
GuardLevel int `json:"guard_level"`
Bubble int64 `json:"bubble"`
}

View File

@@ -0,0 +1,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dm.go",
"http.go",
],
importpath = "go-common/app/interface/live/web-room/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/service:go_default_library",
"//app/interface/live/web-room/service/v1:go_default_library",
"//app/interface/live/web-room/service/v1/dm: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",
],
)
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,57 @@
package http
import (
apiv1 "go-common/app/interface/live/web-room/api/http/v1"
v1index "go-common/app/interface/live/web-room/service/v1/dm"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func sendMsgSendMsg(ctx *bm.Context) {
p := new(apiv1.SendDMReq)
if err := ctx.Bind(p); err != nil {
return
}
_, err := dmservice.SendMsg(ctx, p)
res := map[string]interface{}{}
if e, ok := err.(*ecode.Status); ok {
res["msg"] = e.Message()
res["message"] = e.Message()
//验证返回
if e.Code() == 1990000 {
res["data"] = map[string]string{
"verify_url": "https://live.bilibili.com/p/html/live-app-captcha/index.html?is_live_half_webview=1&hybrid_half_ui=1,5,290,332,0,0,30,0;2,5,290,332,0,0,30,0;3,5,290,332,0,0,30,0;4,5,290,332,0,0,30,0;5,5,290,332,0,0,30,0;6,5,290,332,0,0,30,0;7,5,290,332,0,0,30,0;8,5,290,332,0,0,30,0",
}
}
ctx.JSONMap(res, err)
return
}
res["msg"] = ""
res["message"] = ""
res["data"] = []string{}
ctx.JSONMap(res, err)
}
func getHistory(ctx *bm.Context) {
p := new(apiv1.HistoryReq)
if err := ctx.Bind(p); err != nil {
return
}
resp, err := dmservice.GetHistory(ctx, p)
res := map[string]interface{}{}
res["msg"] = ""
res["message"] = ""
empty := make(map[string][]string)
empty["room"] = make([]string, 0)
empty["admin"] = make([]string, 0)
if err != nil {
res["data"] = empty
ctx.JSONMap(res, err)
return
}
res["data"] = v1index.HistoryData(resp)
ctx.JSONMap(res, err)
}

View File

@@ -0,0 +1,59 @@
package http
import (
v12 "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
"go-common/app/interface/live/web-room/service"
"go-common/app/interface/live/web-room/service/v1"
v1index "go-common/app/interface/live/web-room/service/v1/dm"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"net/http"
)
var (
authn *auth.Auth
srv *service.Service
dmservice *v1index.DMService
)
// Init init
func Init(c *conf.Config) {
srv = service.New(c)
initService(c)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func initService(c *conf.Config) {
dmservice = v1index.NewDMService(c)
authn = auth.New(c.AuthN)
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
g := e.Group("/xlive/web-room")
g.POST("/v1/dM/sendmsg", authn.User, sendMsgSendMsg)
g.POST("/v1/dM/gethistory", getHistory)
v12.RegisterV1CaptchaService(e, v1.NewCaptchaService(conf.Conf), map[string]bm.HandlerFunc{
"auth": authn.User,
})
v12.RegisterV1RoomAdminService(e, v1.NewRoomAdminService(conf.Conf), map[string]bm.HandlerFunc{})
}
func ping(c *bm.Context) {
if err := srv.Ping(c); err != nil {
log.Error("ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func register(c *bm.Context) {
c.JSON(map[string]interface{}{}, nil)
}

View File

@@ -0,0 +1,35 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["service.go"],
importpath = "go-common/app/interface/live/web-room/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/dao:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/web-room/service/v1:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package service
import (
"context"
"go-common/app/interface/live/web-room/conf"
"go-common/app/interface/live/web-room/dao"
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
return s
}
// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
// Close Service
func (s *Service) Close() {
s.dao.Close()
}

View File

@@ -0,0 +1,57 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"captcha.go",
"roomAdmin.go",
],
importpath = "go-common/app/interface/live/web-room/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/dao:go_default_library",
"//app/service/live/xcaptcha/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log: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",
"//app/interface/live/web-room/service/v1/dm:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["roomAdmin_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,105 @@
package v1
import (
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
xCaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
"context"
)
// CaptchaService struct
type CaptchaService struct {
conf *conf.Config
xCaptcha *xCaptcha.Client
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewCaptchaService init
func NewCaptchaService(c *conf.Config) (s *CaptchaService) {
s = &CaptchaService{
conf: c,
}
client, err := xCaptcha.NewClient(c.XCaptcha)
if err != nil {
log.Error("[web-room][captcha][new XCaptcha error] init XCaptcha error, %+v", err)
}
s.xCaptcha = client
return s
}
// captcha 相关服务
// Create implementation
// 创建验证码
func (s *CaptchaService) Create(ctx context.Context, req *v1pb.CreateCaptchaReq) (resp *v1pb.CreateCaptchaResp, err error) {
resp = &v1pb.CreateCaptchaResp{}
uid, _ := metadata.Value(ctx, "mid").(int64)
if uid <= 0 {
err = ecode.Error(ecode.NoLogin, "未登录")
return
}
XCaptchaReq := &xCaptcha.XCreateCaptchaReq{
Type: req.GetType(),
ClientType: req.GetClientType(),
Height: req.GetHeight(),
Width: req.GetWidth(),
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
}
if s.xCaptcha == nil {
err = ecode.Error(ecode.ServerErr, "创建验证码失败")
return
}
XCaptchaResp, err := s.xCaptcha.Create(ctx, XCaptchaReq)
if err != nil || XCaptchaResp == nil {
return
}
resp = &v1pb.CreateCaptchaResp{
Type: XCaptchaResp.Type,
Geetest: &v1pb.GeeTest{},
Image: &v1pb.Image{},
}
resp.Geetest.Challenge = XCaptchaResp.Geetest.Challenge
resp.Geetest.Gt = XCaptchaResp.Geetest.Gt
resp.Image.Token = XCaptchaResp.Image.Token
resp.Image.Content = XCaptchaResp.Image.Content
resp.Image.Tips = XCaptchaResp.Image.Tips
return
}
// Verify implementation
// 校验接口 `midware:"auth" method:"POST"`
func (s *CaptchaService) Verify(ctx context.Context, req *v1pb.VerifyReq) (resp *v1pb.VerifyResp, err error) {
resp = &v1pb.VerifyResp{}
uid, _ := metadata.Value(ctx, "mid").(int64)
if uid <= 0 {
err = ecode.Error(ecode.NoLogin, "未登录")
return
}
if req.GetAnti() == "" {
err = ecode.Error(ecode.ParamInvalid, "参数错误")
return
}
XCaptchaReq := &xCaptcha.CheckReq{
Anti: req.GetAnti(),
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
}
if s.xCaptcha == nil {
err = ecode.Error(ecode.ServerErr, "创建验证码失败")
return
}
XCaptchaResp, err := s.xCaptcha.Check(ctx, XCaptchaReq)
if err != nil || XCaptchaResp == nil {
return
}
resp.Type = XCaptchaResp.Type
resp.Token = XCaptchaResp.Token
return
}

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dM.go",
"data.go",
"validate.go",
],
importpath = "go-common/app/interface/live/web-room/service/v1/dm",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/model:go_default_library",
"//app/service/live/live-dm/api/grpc/v1:go_default_library",
"//app/service/live/live_riskcontrol/api/grpc/v1:go_default_library",
"//app/service/live/xcaptcha/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,136 @@
package v1
import (
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
dmrpc "go-common/app/service/live/live-dm/api/grpc/v1"
risk "go-common/app/service/live/live_riskcontrol/api/grpc/v1"
xcaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"strings"
)
// DMService struct
type DMService struct {
conf *conf.Config
}
var (
//dmClient 弹幕clietn
dmClient dmrpc.DMClient
//riskClient 风控Client
riskClient risk.IsForbiddenClient
//验证码client
xcaptchaClient xcaptcha.XCaptchaClient
)
//NewDMService init
func NewDMService(c *conf.Config) (s *DMService) {
s = &DMService{
conf: c,
}
var err error
if dmClient, err = dmrpc.NewClient(c.DM); err != nil {
panic(err)
}
if riskClient, err = risk.NewClient(c.DM); err != nil {
panic(err)
}
if xcaptchaClient, err = xcaptcha.NewClient(c.VerifyConf); err != nil {
panic(err)
}
return s
}
func sendMsg(ctx *bm.Context, req *v1pb.SendDMReq, uid int64) (resp *v1pb.SendMsgResp, err error) {
resp = &v1pb.SendMsgResp{}
ip := metadata.String(ctx, metadata.RemoteIP)
var ck = make([]string, 0, 10)
for _, v := range ctx.Request.Cookies() {
if v.Name != "SESSDATA" {
ck = append(ck, v.Name+"="+v.Value)
}
}
var dmReq = &dmrpc.SendMsgReq{
Uid: uid,
Roomid: req.Roomid,
Msg: req.Msg,
Rnd: req.Rnd,
Ip: ip,
Fontsize: req.Fontsize,
Mode: req.Mode,
Platform: "web",
Msgtype: 0,
Bubble: req.Bubble,
Lancer: &dmrpc.Lancer{
Build: 0,
Buvid: "",
Refer: ctx.Request.Header.Get("Referer"),
UserAgent: ctx.Request.Header.Get("User-Agent"),
Cookie: strings.Join(ck, ";"),
},
}
gresp, gerr := dmClient.SendMsg(ctx, dmReq)
if gerr != nil {
log.Error("DM GRPC ERR: %v", gerr)
err = ecode.Error(1003218, "系统正在维护中,请稍后尝试")
return nil, err
}
if gresp.IsLimit {
err = ecode.Error(ecode.Code(gresp.Code), gresp.LimitMsg)
return nil, err
}
return resp, nil
}
// SendMsg implementation
// `method:"POST"`
func (s *DMService) SendMsg(ctx *bm.Context, req *v1pb.SendDMReq) (resp *v1pb.SendMsgResp, err error) {
uid, ok := ctx.Get("mid")
if !ok {
err = ecode.Error(1003218, "未登录")
return nil, err
}
//验证码
if req.Anti != "" {
result := checkVerify(ctx, req.Anti, uid.(int64), req.Roomid)
if !result {
return nil, ecode.Error(1990001, "验证码验证失败")
}
return sendMsg(ctx, req, uid.(int64))
}
//风控校验
ifb, ferr := isriskcontrol(ctx, uid.(int64), req)
if ifb {
return nil, ferr
}
//发送弹幕
return sendMsg(ctx, req, uid.(int64))
}
// GetHistory implementation
// `method:"POST"`
func (s *DMService) GetHistory(ctx *bm.Context, req *v1pb.HistoryReq) (resp *v1pb.HistoryResp, err error) {
resp = &v1pb.HistoryResp{}
var hreq = &dmrpc.HistoryReq{
Roomid: req.Roomid,
}
gresp, err := dmClient.GetHistory(ctx, hreq)
if err != nil {
log.Error("DM GRPC ERR: %v", err)
return
}
resp.Admin = gresp.Admin
resp.Room = gresp.Room
return
}

View File

@@ -0,0 +1,32 @@
package v1
import (
"encoding/json"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/model"
)
//HistoryData 历史数据处理
func HistoryData(data *v1pb.HistoryResp) map[string][]*model.History {
var result = make(map[string][]*model.History)
result["admin"] = make([]*model.History, 0, 10)
result["room"] = make([]*model.History, 0, 10)
for i := 0; i < len(data.Admin); i++ {
var h = &model.History{}
err := json.Unmarshal([]byte(data.Admin[i]), h)
if err != nil {
break
}
result["admin"] = append(result["admin"], h)
}
for i := 0; i < len(data.Room); i++ {
var h = &model.History{}
err := json.Unmarshal([]byte(data.Room[i]), h)
if err != nil {
break
}
result["room"] = append(result["room"], h)
}
return result
}

View File

@@ -0,0 +1,79 @@
package v1
import (
"encoding/json"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
risk "go-common/app/service/live/live_riskcontrol/api/grpc/v1"
xcaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
type rbody struct {
Roomid int64 `json:"roomid"`
Msg string `json:"msg" `
Rnd string `json:"rnd" `
Fontsize int64 `json:"fontsize"`
Mode int64 `json:"mode" `
Color int64 `json:"color"`
Bubble int64 `json:"bubble"`
}
func isriskcontrol(ctx *bm.Context, uid int64, r *v1pb.SendDMReq) (forbid bool, err *ecode.Status) {
req := &risk.GetForbiddenReq{
Uid: uid,
Uri: "/xlive/app-room/v1/dM/sendmsg",
Ip: metadata.String(ctx, metadata.RemoteIP),
Method: "POST",
Header: make(map[string]string),
}
for k := range ctx.Request.Header {
req.Header[k] = ctx.Request.Header.Get(k)
}
rb := &rbody{
Roomid: r.Roomid,
Msg: r.Msg,
Rnd: r.Rnd,
Fontsize: r.Fontsize,
Mode: r.Mode,
Color: r.Color,
Bubble: r.Bubble,
}
jb, _ := json.Marshal(rb)
req.Body = string(jb)
resp, rerr := riskClient.GetForbidden(ctx, req)
if rerr != nil {
log.Error("DM: riskcontrol err:%+v", rerr)
return false, nil
}
switch resp.IsForbidden {
case 0:
return false, nil
case 1:
return true, ecode.Error(400, "访问被拒绝")
case 2:
return true, ecode.Error(1990000, "need a second time verify")
}
return false, nil
}
func checkVerify(ctx *bm.Context, anti string, uid int64, roomid int64) bool {
req := &xcaptcha.XVerifyReq{
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
XAnti: anti,
RoomId: roomid,
}
if _, err := xcaptchaClient.Verify(ctx, req); err != nil {
return false
}
return true
}

View File

@@ -0,0 +1,75 @@
package v1
import (
"context"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
"go-common/app/interface/live/web-room/dao"
"go-common/library/log"
)
// RoomAdminService struct
type RoomAdminService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
dao *dao.Dao
}
//NewRoomAdminService init
func NewRoomAdminService(c *conf.Config) (s *RoomAdminService) {
s = &RoomAdminService{
conf: c,
dao: dao.New(c),
}
return s
}
// History 相关服务
// GetByRoom implementation
// 获取主播拥有的的所有房管, 无需登录态
// `method:"GET"
func (s *RoomAdminService) GetByRoom(ctx context.Context, req *v1pb.RoomAdminGetByRoomReq) (resp *v1pb.RoomAdminGetByRoomResp, err error) {
// 默认值
resp = &v1pb.RoomAdminGetByRoomResp{
Page: &v1pb.RoomAdminGetByRoomResp_Page{
Page: 1,
PageSize: 1,
TotalPage: 1,
TotalCount: 0,
},
Data: []*v1pb.RoomAdminGetByRoomResp_Data{},
}
roomID := req.GetRoomid()
page := req.GetPage()
pageSize := req.GetPageSize()
if page <= 0 {
page = 1
}
if pageSize <= 0 || pageSize > 100 {
pageSize = int64(10)
}
ret, err := s.dao.GetByRoomIDPage(ctx, roomID, page, pageSize)
if ret == nil {
log.Info("call GetByAnchor nil mid(%v) err (%v)", roomID, err)
return
}
if err != nil {
return
}
if nil != ret.Page {
resp.Page = ret.Page
}
if nil != ret.Data {
resp.Data = ret.Data
}
return
}

View File

@@ -0,0 +1,40 @@
package v1
import (
"context"
"flag"
"fmt"
"go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
"go-common/library/net/metadata"
"testing"
"github.com/smartystreets/goconvey/convey"
)
var roomAdmin *RoomAdminService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
roomAdmin = NewRoomAdminService(conf.Conf)
}
func TestV1NewRoomAdminService(t *testing.T) {
convey.Convey("NewRoomAdminService", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(25156756),
})
res, err := roomAdmin.GetByRoom(ctx, &v1.RoomAdminGetByRoomReq{
Page: 0,
Roomid: 1008,
PageSize: 0,
})
fmt.Println("------", res, err, "-------")
t.Logf("%v,%s", res, err)
convey.So(err, convey.ShouldBeNil)
})
}