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,56 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/push/conf:go_default_library",
"//app/admin/main/push/model:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"dataplatform.go",
"task.go",
"wechat.go",
],
importpath = "go-common/app/admin/main/push/dao",
tags = ["automanaged"],
deps = [
"//app/admin/main/push/conf:go_default_library",
"//app/admin/main/push/model:go_default_library",
"//library/database/orm:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/jinzhu/gorm: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 dao
import (
"context"
"go-common/app/admin/main/push/conf"
"go-common/library/database/orm"
sqlx "go-common/library/database/sql"
xhttp "go-common/library/net/http/blademaster"
"github.com/jinzhu/gorm"
)
// Dao struct user of Dao.
type Dao struct {
c *conf.Config
db *sqlx.DB
DB *gorm.DB
httpClient *xhttp.Client
}
// New create a instance of Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
db: sqlx.NewMySQL(c.MySQL),
DB: orm.NewMySQL(c.ORM),
httpClient: xhttp.NewClient(c.HTTPClient),
}
d.initORM()
return
}
func (d *Dao) initORM() {
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
if defaultTableName == "push_business" {
return defaultTableName
}
return "push_" + defaultTableName
}
d.DB.LogMode(true)
}
// Ping check connection of db , mc.
func (d *Dao) Ping(c context.Context) (err error) {
if d.DB != nil {
err = d.DB.DB().PingContext(c)
}
return
}
// Close close connection of db , mc.
func (d *Dao) Close() {
if d.DB != nil {
d.DB.Close()
}
}

View File

@@ -0,0 +1,83 @@
package dao
import (
"context"
"flag"
"path/filepath"
"testing"
"go-common/app/admin/main/push/conf"
"go-common/app/admin/main/push/model"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func init() {
dir, _ := filepath.Abs("../cmd/push-admin-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func WithDao(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func Test_Dao(t *testing.T) {
Convey("dao test", t, WithDao(func(d *Dao) {
d.Ping(context.TODO())
}))
}
func Test_AddDPCondition(t *testing.T) {
Convey("AddDPCondition", t, WithDao(func(d *Dao) {
cond := &model.DPCondition{
Task: 123,
Job: "456",
Condition: "cond",
SQL: "sql",
Status: 2,
StatusURL: "status url",
File: "file",
}
id, err := d.AddDPCondition(context.Background(), cond)
So(err, ShouldBeNil)
So(id, ShouldBeGreaterThan, 0)
}))
}
func Test_DPCondition(t *testing.T) {
Convey("DPContion", t, WithDao(func(d *Dao) {
res, err := d.DPCondition(context.Background(), "456")
So(err, ShouldBeNil)
t.Logf("res(%+v)", res)
}))
}
func Test_AddTask(t *testing.T) {
Convey("add task", t, WithDao(func(d *Dao) {
t := &model.Task{Job: "123", AppID: 2}
_, err := d.AddTask(context.Background(), t)
So(err, ShouldBeNil)
}))
}
func Test_TaskInfo(t *testing.T) {
Convey("task info", t, WithDao(func(d *Dao) {
task, err := d.TaskInfo(context.Background(), 117)
So(err, ShouldBeNil)
t.Logf("task(%+v)", task)
}))
}
func Test_Partitions(t *testing.T) {
Convey("partitions", t, WithDao(func(d *Dao) {
res, err := d.Partitions(context.Background())
So(err, ShouldBeNil)
t.Logf("partitions(%v)", res)
}))
}

View File

@@ -0,0 +1,74 @@
package dao
import (
"context"
"go-common/app/admin/main/push/model"
"go-common/library/database/sql"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_dpConditionSQL = `select id,job,task,conditions,sql_stmt,status,status_url,file from push_dataplatform_conditions where job=?`
_addDpConditionSQL = `insert into push_dataplatform_conditions (job,task,conditions,sql_stmt,status,status_url,file) values (?,?,?,?,?,?,?) on duplicate key update task=?,conditions=?,sql_stmt=?,status=?,status_url=?,file=?`
_updateDpConditionStatusSQL = `update push_dataplatform_conditions set status=? where job=?`
)
// AddDPCondition add data platform task
func (d *Dao) AddDPCondition(ctx context.Context, cond *model.DPCondition) (id int64, err error) {
res, err := d.db.Exec(ctx, _addDpConditionSQL, cond.Job, cond.Task, cond.Condition, cond.SQL, cond.Status, cond.StatusURL, cond.File,
cond.Task, cond.Condition, cond.SQL, cond.Status, cond.StatusURL, cond.File)
if err != nil {
log.Error("d.AddDPCondition(%+v) error(%v)", cond, err)
return
}
id, err = res.LastInsertId()
return
}
// DPCondition .
func (d *Dao) DPCondition(ctx context.Context, job string) (c *model.DPCondition, err error) {
c = new(model.DPCondition)
if err = d.db.QueryRow(ctx, _dpConditionSQL, job).Scan(&c.ID, &c.Job, &c.Task, &c.Condition, &c.SQL, &c.Status, &c.StatusURL, &c.File); err != nil {
if err == sql.ErrNoRows {
c = nil
err = nil
}
return
}
return
}
// UpdateDpCondtionStatus .
func (d *Dao) UpdateDpCondtionStatus(ctx context.Context, job string, status int) (err error) {
_, err = d.db.Exec(ctx, _updateDpConditionStatusSQL, status, job)
return
}
// Partitions 获取一级分区数据
func (d *Dao) Partitions(ctx context.Context) (m map[int]string, err error) {
var res = struct {
Code int `json:"code"`
Data map[int]struct {
ID int `json:"id"`
Pid int `json:"pid"`
Name string `json:"name"`
} `json:"data"`
}{}
if err = d.httpClient.Get(ctx, d.c.Cfg.PartitionsURL, "", nil, &res); err != nil {
return
}
if !ecode.Int(res.Code).Equal(ecode.OK) {
err = ecode.Int(res.Code)
return
}
m = make(map[int]string)
for _, v := range res.Data {
if v.Pid != 0 {
continue
}
m[v.ID] = v.Name
}
return
}

View File

@@ -0,0 +1,43 @@
package dao
import (
"context"
"database/sql"
"go-common/app/admin/main/push/model"
"go-common/library/log"
)
const (
_addTaskSQL = "insert into push_tasks (job,type,app_id,business_id,title,summary,link_type,link_value,sound,vibration,push_time,expire_time,status,`group`,image_url,extra) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
_taskInfoSQL = "select id,job,type,app_id,business_id,platform,title,summary,link_type,link_value,build,sound,vibration,pass_through,mid_file,progress,push_time,expire_time,status,`group`,image_url from push_tasks where id=?"
)
// TaskInfo .
func (d *Dao) TaskInfo(ctx context.Context, id int64) (t *model.Task, err error) {
t = &model.Task{}
if err = d.db.QueryRow(ctx, _taskInfoSQL, id).Scan(&t.ID, &t.Job, &t.Type, &t.AppID, &t.BusinessID, &t.Platform, &t.Title, &t.Summary, &t.LinkType, &t.LinkValue, &t.Build,
&t.Sound, &t.Vibration, &t.PassThrough, &t.MidFile, &t.Progress, &t.PushTime, &t.ExpireTime, &t.Status, &t.Group, &t.ImageURL); err != nil {
if err == sql.ErrNoRows {
t = nil
err = nil
return
}
log.Error("d.TaskInfo(%s) error(%v)", id, err)
return
}
t.PushTimeUnix = t.PushTime.Unix()
t.ExpireTimeUnix = t.ExpireTime.Unix()
return
}
// AddTask add data platform task
func (d *Dao) AddTask(ctx context.Context, t *model.Task) (id int64, err error) {
var res sql.Result
if res, err = d.db.Exec(ctx, _addTaskSQL, t.Job, t.Type, t.AppID, t.BusinessID, t.Title, t.Summary, t.LinkType, t.LinkValue, t.Sound, t.Vibration, t.PushTime, t.ExpireTime, t.Status, t.Group, t.ImageURL, t.Extra); err != nil {
log.Error("d.AddTask(%+v) error(%v)", t, err)
return
}
id, err = res.LastInsertId()
return
}

View File

@@ -0,0 +1,81 @@
package dao
import (
"bytes"
"context"
"crypto/md5"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"sort"
"strconv"
"time"
"go-common/library/log"
)
type wechatResp struct {
Status int `json:"status"`
Msg string `json:"msg"`
}
const (
// http://info.bilibili.co/pages/viewpage.action?pageId=5406728
_url = "http://bap.bilibili.co/api/v1/message/add"
)
// SendWechat 发送企业微信消息
func (d *Dao) SendWechat(msg string) (err error) {
log.Error("SendWechat logged error(%s)", msg)
params := map[string]string{
"content": msg,
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
"token": d.c.Wechat.Token,
"type": "wechat",
"username": d.c.Wechat.Username,
"url": "",
}
params["signature"] = d.sign(params)
b, err := json.Marshal(params)
if err != nil {
log.Error("SendWechat json.Marshal error(%v)", err)
return
}
req, err := http.NewRequest(http.MethodPost, _url, bytes.NewReader(b))
if err != nil {
log.Error("SendWechat NewRequest error(%v), params(%s)", err, string(b))
return
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
res := wechatResp{}
if err = d.httpClient.Do(context.TODO(), req, &res); err != nil {
log.Error("SendWechat Do error(%v), params(%s)", err, string(b))
return
}
if res.Status != 0 {
err = fmt.Errorf("status(%d) msg(%s)", res.Status, res.Msg)
log.Error("SendWechat response error(%v), params(%s)", err, string(b))
}
return
}
func (d *Dao) sign(params map[string]string) string {
keys := []string{}
for k := range params {
keys = append(keys, k)
}
sort.Strings(keys)
buf := bytes.Buffer{}
for _, k := range keys {
if buf.Len() > 0 {
buf.WriteByte('&')
}
buf.WriteString(url.QueryEscape(k) + "=")
buf.WriteString(url.QueryEscape(params[k]))
}
h := md5.New()
io.WriteString(h, buf.String()+d.c.Wechat.Secret)
return fmt.Sprintf("%x", h.Sum(nil))
}