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,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 = [
"api.go",
"dao.go",
"db.go",
],
importpath = "go-common/app/job/main/creative/dao/newcomer",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/creative/api:go_default_library",
"//app/job/main/creative/conf:go_default_library",
"//app/job/main/creative/model:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = [
"api_test.go",
"dao_test.go",
"db_test.go",
],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/job/main/creative/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,45 @@
package newcomer
import (
"context"
"errors"
"net/url"
"go-common/library/log"
"go-common/library/xstr"
)
// SendNotify send msg notify user
func (d *Dao) SendNotify(c context.Context, mids []int64, mc, title, context string) (err error) {
var (
params = url.Values{}
res struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data *struct {
TotalCount int `json:"total_count"`
ErrorCount int `json:"error_count"`
ErrorMidList []int64 `json:"error_mid_list"`
} `json:"data"`
}
)
params.Set("mc", mc) //消息码,用于识别消息类别
params.Set("data_type", "4") //消息类型1、回复我的 2、@我 3、收到的爱 4、业务通知 5、系统公告
params.Set("title", title) //消息标题
params.Set("context", context) //消息实体内容
params.Set("mid_list", xstr.JoinInts(mids)) //用于接收该消息的用户mid列表不超过1000个(半角逗号分割)
log.Info("SendNotify params(%+v)|msgURI(%s)", params.Encode(), d.msgURI)
if err = d.httpClient.Post(c, d.msgURI, "", params, &res); err != nil {
log.Error("d.httpClient.Post(%s,%v,%d)", d.msgURI, params, err)
return
}
if res.Code != 0 {
err = errors.New("code != 0")
log.Error("d.httpClient.Post(%s,%v,%v,%d)", d.msgURI, params, err, res.Code)
}
if res.Data != nil {
log.Info("SendNotify log total_count(%d) error_count(%d) error_mid_list(%v)", res.Data.TotalCount, res.Data.ErrorCount, res.Data.ErrorMidList)
}
return
}

View File

@@ -0,0 +1,26 @@
package newcomer
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestNewcomerSendNotify(t *testing.T) {
convey.Convey("Msg", t, func(ctx convey.C) {
var (
c = context.Background()
mids = []int64{27515405}
mc = "1_17_2"
title = "creative"
context = "sssss"
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.SendNotify(c, mids, mc, title, context)
ctx.Convey("Then err should be nil.msg should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}

View File

@@ -0,0 +1,55 @@
package newcomer
import (
"context"
grpc "go-common/app/interface/main/creative/api"
"go-common/app/job/main/creative/conf"
"go-common/library/database/sql"
httpx "go-common/library/net/http/blademaster"
)
// Dao is search dao.
type Dao struct {
c *conf.Config
//db
db *sql.DB
//grpc
grpcClient grpc.CreativeClient
// http
httpClient *httpx.Client
msgURI string
}
// New new a search dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
db: sql.NewMySQL(c.DB.Creative),
httpClient: httpx.NewClient(c.HTTPClient.Slow),
msgURI: c.Host.Message + "/api/notify/send.user.notify.do", //发送用户通知消息接口
}
var err error
if d.grpcClient, err = grpc.NewClient(c.CreativeGRPClient); err != nil {
panic(err)
}
return d
}
// CheckTaskState call grpc client.
func (d *Dao) CheckTaskState(c context.Context, MID, TaskID int64) (*grpc.TaskReply, error) {
return d.grpcClient.CheckTaskState(c, &grpc.TaskRequest{Mid: MID, TaskId: TaskID})
}
// Ping ping grpc.
func (d *Dao) Ping(c context.Context) (err error) {
d.grpcClient.Ping(c, nil)
return
}
// Close close grpc.
func (d *Dao) Close(c context.Context) (err error) {
d.grpcClient.Close(c, nil)
return
}

View File

@@ -0,0 +1,34 @@
package newcomer
import (
"flag"
"go-common/app/job/main/creative/conf"
"os"
"testing"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.archive.creative-job")
flag.Set("conf_token", "43943fda0bb311e8865c66d44b23cda7")
flag.Set("tree_id", "16037")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/creative-job.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,230 @@
package newcomer
import (
"context"
"fmt"
"time"
"go-common/app/job/main/creative/model"
"go-common/library/log"
)
//UserTasks get user unfinish task.
func (d *Dao) UserTasks(c context.Context, index string, id int64, limit int) (res []*model.UserTask, err error) {
_getUserTaskSQL := "SELECT id, mid, task_id, task_group_id, task_type, state, task_bind_time, ctime, mtime FROM newcomers_task_user_%s WHERE state=-1 AND id > ? order by id asc limit ?"
rows, err := d.db.Query(c, fmt.Sprintf(_getUserTaskSQL, index), id, limit)
if err != nil {
log.Error("UserTasks d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.UserTask, 0)
for rows.Next() {
r := &model.UserTask{}
if err = rows.Scan(&r.ID, &r.MID, &r.TaskID, &r.TaskGroupID, &r.TaskType, &r.State, &r.TaskBindTime, &r.CTime, &r.MTime); err != nil {
log.Error("UserTasks rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}
// getTableName by mid%100
func getTableName(mid int64) string {
return fmt.Sprintf("%02d", mid%100)
}
// UpUserTask update user task finish state
func (d *Dao) UpUserTask(c context.Context, mid, tid int64) (int64, error) {
_upUserTaskSQL := "UPDATE newcomers_task_user_%s SET state=? WHERE mid=? AND task_id=?"
res, err := d.db.Exec(c, fmt.Sprintf(_upUserTaskSQL, getTableName(mid)), 0, mid, tid)
if err != nil {
log.Error("RewardActivate d.db.Exec mid(%d) id(%d) error(%v)", mid, tid, err)
return 0, err
}
return res.RowsAffected()
}
//UserTasksByMIDAndState get user unfinish task by mid & state.
func (d *Dao) UserTasksByMIDAndState(c context.Context, mid int64, state int) (res []*model.UserTask, err error) {
_getUserTaskByMIDSQL := "SELECT id, mid, task_id, task_group_id, task_type, state, ctime, mtime FROM newcomers_task_user_%s WHERE mid=? AND state=?"
rows, err := d.db.Query(c, fmt.Sprintf(_getUserTaskByMIDSQL, getTableName(mid)), mid, state)
if err != nil {
log.Error("UserTasksByMIDAndState d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.UserTask, 0)
for rows.Next() {
r := &model.UserTask{}
if err = rows.Scan(&r.ID, &r.MID, &r.TaskID, &r.TaskGroupID, &r.TaskType, &r.State, &r.CTime, &r.MTime); err != nil {
log.Error("UserTasksByMIDAndState rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}
//Tasks get all task.
func (d *Dao) Tasks(c context.Context) (res []*model.Task, err error) {
_getTaskSQL := "SELECT id, group_id, type, state, target_type, target_value, title, `desc`, comment, ctime, mtime FROM newcomers_task WHERE state=0"
rows, err := d.db.Query(c, _getTaskSQL)
if err != nil {
log.Error("Tasks d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.Task, 0)
for rows.Next() {
r := &model.Task{}
if err = rows.Scan(&r.ID, &r.GroupID, &r.Type, &r.State, &r.TargetType, &r.TargetValue, &r.Title, &r.Desc, &r.Comment, &r.CTime, &r.MTime); err != nil {
log.Error("Tasks rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}
// TaskByTID get task by task_id
func (d *Dao) TaskByTID(c context.Context, mid int64, tid int64) (res *model.Task, err error) {
_getOneTaskSQL := fmt.Sprintf("SELECT task_id,task_group_id,task_type,state FROM newcomers_task_user_%s WHERE mid=? AND task_id=?", getTableName(mid))
row := d.db.QueryRow(c, _getOneTaskSQL, mid, tid)
res = &model.Task{}
if err = row.Scan(&res.ID, &res.GroupID, &res.Type, &res.State); err != nil {
log.Error("TaskByTID ow.Scan error(%v)", err)
return
}
return
}
// CheckTaskComplete check task complete state
func (d *Dao) CheckTaskComplete(c context.Context, mid int64, tid int64) bool {
task, err := d.TaskByTID(c, mid, tid)
if err != nil || task == nil {
return false
}
if task.State == 0 {
return true
}
return false
}
//UserTasksNotify get unfinish task send notify to user.
func (d *Dao) UserTasksNotify(c context.Context, index string, id int64, start, end string, limit int) (res []*model.UserTask, err error) {
_getUserTaskSQL := "SELECT id, mid, task_id, task_group_id, task_type, state, ctime, mtime FROM newcomers_task_user_%s WHERE state=-1 AND task_type=1 AND id>? AND ctime >= ? AND ctime <= ? order by id asc limit ?"
rows, err := d.db.Query(c, fmt.Sprintf(_getUserTaskSQL, index), id, start, end, limit)
if err != nil {
log.Error("UserTasks d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.UserTask, 0)
for rows.Next() {
r := &model.UserTask{}
if err = rows.Scan(&r.ID, &r.MID, &r.TaskID, &r.TaskGroupID, &r.TaskType, &r.State, &r.CTime, &r.MTime); err != nil {
log.Error("UserTasks rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}
//UserTasksByMID get user unfinish task by mid.
func (d *Dao) UserTasksByMID(c context.Context, mid int64) (res []*model.UserTask, err error) {
_getUserTaskByMIDSQL := "SELECT id, mid, task_id, task_group_id, task_type, state, ctime, mtime FROM newcomers_task_user_%s WHERE mid=?"
rows, err := d.db.Query(c, fmt.Sprintf(_getUserTaskByMIDSQL, getTableName(mid)), mid)
if err != nil {
log.Error("UserTasksByMID d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.UserTask, 0)
for rows.Next() {
r := &model.UserTask{}
if err = rows.Scan(&r.ID, &r.MID, &r.TaskID, &r.TaskGroupID, &r.TaskType, &r.State, &r.CTime, &r.MTime); err != nil {
log.Error("UserTasksByMID rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}
// AllGiftRewards get all GiftRewards for cache
func (d *Dao) AllGiftRewards(c context.Context) (res map[int8][]*model.GiftReward, err error) {
_getAllGiftRewardSQL := "SELECT task_type,reward_id,state,comment,ctime,mtime FROM newcomers_gift_reward WHERE state=0"
rows, err := d.db.Query(c, _getAllGiftRewardSQL)
if err != nil {
log.Error("AllGiftRewards d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make(map[int8][]*model.GiftReward)
for rows.Next() {
t := &model.GiftReward{}
if err = rows.Scan(&t.TaskType, &t.RewardID, &t.State, &t.Comment, &t.CTime, &t.MTime); err != nil {
log.Error("AllGiftRewards rows.Scan error(%v)", err)
return
}
res[t.TaskType] = append(res[t.TaskType], t)
}
return
}
// GiftRewardCount get received gift reward count
func (d *Dao) GiftRewardCount(c context.Context, mid int64) (res int, err error) {
sqlStr := "SELECT count(DISTINCT task_gift_id) FROM newcomers_reward_receive WHERE NOT task_gift_id=0 AND mid=?"
row := d.db.QueryRow(c, sqlStr, mid)
err = row.Scan(&res)
if err != nil {
log.Error("GiftRewardCount d.db.QueryRow error(%v)", err)
}
return
}
// BaseRewardCount get received base reward count
func (d *Dao) BaseRewardCount(c context.Context, mid int64) (res int, err error) {
sqlStr := "SELECT count(DISTINCT task_group_id) FROM newcomers_reward_receive WHERE NOT task_group_id=0 AND mid=?"
row := d.db.QueryRow(c, sqlStr, mid)
err = row.Scan(&res)
if err != nil {
log.Error("BaseRewardCount d.db.QueryRow error(%v)", err)
}
return
}
//CheckTasksForRewardNotify get finish task send notify to user.
func (d *Dao) CheckTasksForRewardNotify(c context.Context, index string, id int64, startMtime, endMtime time.Time, limit int) (res []*model.UserTask, err error) {
_getUserTaskSQL := "SELECT id, mid, task_id, task_group_id, task_type, state, ctime, mtime FROM newcomers_task_user_%s WHERE state=0 AND id>? AND mtime>=? AND mtime<=? order by id asc limit ?"
rows, err := d.db.Query(c, fmt.Sprintf(_getUserTaskSQL, index), id, startMtime.Format("2006-01-02 15:04:05"), endMtime.Format("2006-01-02 15:04:05"), limit)
if err != nil {
log.Error("UserTasks d.db.Query error(%v)", err)
return
}
defer rows.Close()
res = make([]*model.UserTask, 0)
for rows.Next() {
r := &model.UserTask{}
if err = rows.Scan(&r.ID, &r.MID, &r.TaskID, &r.TaskGroupID, &r.TaskType, &r.State, &r.CTime, &r.MTime); err != nil {
log.Error("UserTasks rows.Scan error(%v)", err)
return
}
res = append(res, r)
}
return
}

View File

@@ -0,0 +1,200 @@
package newcomer
import (
"context"
"testing"
"time"
"github.com/smartystreets/goconvey/convey"
)
func TestNewcomerUserTasks(t *testing.T) {
convey.Convey("UserTasks", t, func(ctx convey.C) {
var (
c = context.Background()
index = ""
id = int64(0)
limit = int(100)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.UserTasks(c, index, id, limit)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomergetTableName(t *testing.T) {
convey.Convey("getTableName", t, func(ctx convey.C) {
var (
mid = int64(27515405)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
p1 := getTableName(mid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldEqual, p1)
})
})
})
}
func TestNewcomerUpUserTask(t *testing.T) {
convey.Convey("UpUserTask", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
tid = int64(1)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.UpUserTask(c, mid, tid)
ctx.Convey("Then err should be nil.p1 should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerUserTasksByMID(t *testing.T) {
convey.Convey("UserTasksByMID", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.UserTasksByMID(c, mid)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerTaskByTID(t *testing.T) {
convey.Convey("TaskByTID", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
tid = int64(1)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.TaskByTID(c, mid, tid)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerTasks(t *testing.T) {
convey.Convey("Tasks", t, func(ctx convey.C) {
var (
c = context.Background()
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.Tasks(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerCheckTaskComplete(t *testing.T) {
convey.Convey("CheckTaskComplete", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
tid = int64(1)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res := d.CheckTaskComplete(c, mid, tid)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(res, convey.ShouldEqual, res)
})
})
})
}
func TestNewcomerUserTasksNotify(t *testing.T) {
convey.Convey("UserTasksNotify", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
index = "1"
start = time.Now().Format("2006-01-02 15:04:05")
end = time.Now().Format("2006-01-02 15:04:05")
limit = 100
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.UserTasksNotify(c, index, id, start, end, limit)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerGiftRewardCount(t *testing.T) {
convey.Convey("GiftRewardCount", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.GiftRewardCount(c, mid)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerBaseRewardCount(t *testing.T) {
convey.Convey("BaseRewardCount", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.BaseRewardCount(c, mid)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerCheckTasksForRewardNotify(t *testing.T) {
convey.Convey("CheckTasksForRewardNotify", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
index = "1"
start = time.Now()
end = time.Now()
limit = 100
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.CheckTasksForRewardNotify(c, index, id, start, end, limit)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}
func TestNewcomerUserTasksByMIDAndState(t *testing.T) {
convey.Convey("UserTasksByMIDAndState", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(27515405)
state = 0
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
_, err := d.UserTasksByMIDAndState(c, mid, state)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldEqual, err)
})
})
})
}