Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/laser/cmd:all-srcs",
"//app/interface/main/laser/conf:all-srcs",
"//app/interface/main/laser/dao:all-srcs",
"//app/interface/main/laser/http:all-srcs",
"//app/interface/main/laser/model:all-srcs",
"//app/interface/main/laser/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,11 @@
#### laser-interface
##### version 1.0.1
> 1.更新任务状态接口:兼容Android端公共字段platform为android字符
##### version 1.0.0
> 1.兼容Android端公共字段platform为android字符
##### version 0.0.1
> 1.初始化laser-interface应用
> 2.根据主站新工程规范,迁移目录和改造公共组件

View File

@@ -0,0 +1,10 @@
# Owner
haoguanwei
shencen
# Author
shencen
yanjinbin
# Reviewer
shencen

View File

@@ -0,0 +1,15 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- haoguanwei
- shencen
- yanjinbin
labels:
- interface
- interface/main/laser
- main
options:
no_parent_owners: true
reviewers:
- shencen
- yanjinbin

View File

@@ -0,0 +1,10 @@
#### laser-interface
##### 项目简介
> laser-interface
##### 编译环境
> 请只用golang v1.8.x以上版本编译执行
##### 依赖包
> 1.公共包go-common/library

View File

@@ -0,0 +1,41 @@
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 = ["laser-interface.toml"],
importpath = "go-common/app/interface/main/laser/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/laser/conf:go_default_library",
"//app/interface/main/laser/http: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,87 @@
# This is a TOML document. Boom.
version = "1.0.0"
user = "nobody"
pid = "/tmp/laser-interface.pid"
dir = "./"
perf = "0.0.0.0:7512"
checkFile = "/data/www/laser-interface.html"
[log]
dir = "/data/log/laser-interface/"
[mysql]
dsn = "root:12345@tcp(127.0.0.1:3306)/bilibili_laser?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 5
idleTimeout = "4h"
queryTimeout = "5s"
execTimeout = "5s"
tranTimeout = "10s"
[mysql.breaker]
window = "30s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[bm]
addr = "0.0.0.0:7510"
maxListen = 1000
timeout = "2s"
[identify]
whiteAccessKey = ""
whiteMid = 0
csrf = false
[identify.app]
key = "53e2fa226f5ad348"
secret = "3cf6bd1b0ff671021da5f424fea4b04a"
[identify.memcache]
name = "go-business/identify"
proto = "unix"
addr = "/tmp/uat-platform-identify-mc.sock"
active = 10
idle = 5
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[identify.host]
auth = "http://uat-passport.bilibili.com"
secret = "http://uat-open.bilibili.com"
[identify.httpClient]
key = "53e2fa226f5ad348"
secret = "3cf6bd1b0ff671021da5f424fea4b04a"
dial = "500ms"
timeout = "800ms"
keepAlive = "60s"
[identify.httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[identify.httpClient.url]
"http://uat-passport.bilibili.co/intranet/auth/tokenInfo" = {timeout = "100ms"}
"http://uat-passport.bilibili.co/intranet/auth/cookieInfo" = {timeout = "100ms"}
"http://uat-open.bilibili.co/api/getsecret" = {timeout = "500ms"}
[memcache]
[memcache.laser]
name = "creative/archive"
proto = "tcp"
addr = "172.16.0.148:11211"
idle = 5
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
LaserExpire = "60s"
[mail]
host = "smtp.exmail.qq.com"
port = 465
username = "2333@bilibili.com"
password = "233"

View File

@@ -0,0 +1,42 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/interface/main/laser/conf"
"go-common/app/interface/main/laser/http"
"go-common/library/log"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
log.Error("conf.Init() error(%v)", err)
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("laser-interface start")
http.Init(conf.Conf)
// signal handler
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("laser-interface get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGINT:
time.Sleep(time.Second * 2)
log.Info("laser-interface exit")
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,38 @@
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/main/laser/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/BurntSushi/toml:go_default_library",
"//vendor/github.com/pkg/errors: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,105 @@
package conf
import (
"flag"
"github.com/BurntSushi/toml"
"github.com/pkg/errors"
"go-common/library/cache/memcache"
"go-common/library/conf"
"go-common/library/database/sql"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/time"
)
var (
// ConfPath local config path
ConfPath string
// Conf config
Conf = &Config{}
client *conf.Client
)
// Config str
type Config struct {
// base config
// Elk config
Log *log.Config
// http config
BM *bm.ServerConfig
// db config
Mysql *sql.Config
// mc
Memcache *Memcache
// mail
Mail *Mail
}
// Memcache conf.
type Memcache struct {
Laser struct {
*memcache.Config
LaserExpire time.Duration
}
}
// Mail conf.
type Mail struct {
Host string
Port int
Username, Password string
}
func init() {
flag.StringVar(&ConfPath, "conf", "", "default config path")
}
// Init init conf
func Init() (err 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
tempConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tempConf); err != nil {
return errors.New("could not decode toml config")
}
*Conf = *tempConf
return
}

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 = [
"dao.go",
"email.go",
"memcache.go",
"task.go",
"task_log.go",
],
importpath = "go-common/app/interface/main/laser/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/laser/conf:go_default_library",
"//app/interface/main/laser/model:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"//vendor/gopkg.in/gomail.v2: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,48 @@
package dao
import (
"context"
"crypto/tls"
"go-common/app/interface/main/laser/conf"
"go-common/library/cache/memcache"
xsql "go-common/library/database/sql"
"gopkg.in/gomail.v2"
)
type Dao struct {
c *conf.Config
db *xsql.DB
mc *memcache.Pool
mcExpire int32
email *gomail.Dialer
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
db: xsql.NewMySQL(c.Mysql),
mc: memcache.NewPool(c.Memcache.Laser.Config),
mcExpire: 3600 * 6,
email: gomail.NewDialer(c.Mail.Host, c.Mail.Port, c.Mail.Username, c.Mail.Password),
}
d.email.TLSConfig = &tls.Config{
InsecureSkipVerify: true,
}
return
}
func (d *Dao) Ping(c context.Context) (err error) {
return d.db.Ping(c)
}
func (d *Dao) Close() {
if d.db != nil {
d.db.Close()
}
}
// BeginTran BeginTran.
func (d *Dao) BeginTran(c context.Context) (*xsql.Tx, error) {
return d.db.Begin(c)
}

View File

@@ -0,0 +1,19 @@
package dao
import (
"go-common/library/log"
"gopkg.in/gomail.v2"
)
func (d *Dao) SendEmail(subject string, to string, body string) (err error) {
msg := gomail.NewMessage()
msg.SetHeader("From", d.c.Mail.Username)
msg.SetHeader("To", to)
msg.SetHeader("Subject", subject)
msg.SetBody("text/plain", body)
if err = d.email.DialAndSend(msg); err != nil {
log.Error("s.email.DialAndSend error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,66 @@
package dao
import (
"context"
"go-common/app/interface/main/laser/model"
"go-common/library/cache/memcache"
"go-common/library/log"
"strconv"
)
const (
_prefix = "taskinfo_"
)
func keyTaskInfo(mid int64) string {
return _prefix + strconv.FormatInt(mid, 10)
}
// TaskInfoCache get taskInfo cache
func (d *Dao) TaskInfoCache(c context.Context, mid int64) (ti *model.TaskInfo, err error) {
var (
conn = d.mc.Get(c)
r *memcache.Item
)
defer conn.Close()
r, err = conn.Get(keyTaskInfo(mid))
if err != nil {
if err == memcache.ErrNotFound {
err = nil
} else {
log.Error("conn Get2(%d) error(%v)", mid, err)
}
return
}
if err = conn.Scan(r, &ti); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", r.Value, err)
ti = nil
}
return
}
// AddTaskInfoCache add taskInfo cache
func (d *Dao) AddTaskInfoCache(c context.Context, mid int64, ti *model.TaskInfo) (err error) {
var (
key = keyTaskInfo(mid)
)
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Set(&memcache.Item{Key: key, Object: ti, Flags: memcache.FlagJSON, Expiration: d.mcExpire}); err != nil {
log.Error("memcache.Set(%v) error(%v)", key, err)
}
return
}
// RemoveTaskInfoCache remove taskInfo cache
func (d *Dao) RemoveTaskInfoCache(c context.Context, mid int64) (err error) {
var (
key = keyTaskInfo(mid)
)
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(key); err != nil {
log.Error("memcache.Delete(%v) error(%v)", key, err)
}
return
}

View File

@@ -0,0 +1,68 @@
package dao
import (
"context"
"github.com/pkg/errors"
"database/sql"
"go-common/app/interface/main/laser/model"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
const (
_queryTaskInfoSql = "SELECT mid, log_date, source_type, platform FROM task WHERE state = 0 AND is_deleted = 0 AND mid = ?"
_updateStateSql = "UPDATE task SET state = ? WHERE is_deleted = 0 AND id = ? "
_queryTaskIDSql = "SELECT id FROM task WHERE is_deleted = 0 AND state = 0 and mid = ? "
_selectByPrimaryID = "SELECT id, admin_id, mid, log_date, contact_email, source_type, platform,state, is_deleted, mtime, ctime FROM task WHERE id = ? AND is_deleted = 0"
)
func (d *Dao) QueryUndoneTaskInfo(c context.Context, mid int64) (t *model.TaskInfo, err error) {
t = &model.TaskInfo{}
row := d.db.QueryRow(c, _queryTaskInfoSql, mid)
if err = row.Scan(&t.MID, &t.LogDate, &t.SourceType, &t.Platform); err != nil {
if err == sql.ErrNoRows {
t = nil
err = nil
} else {
err = errors.WithStack(err)
log.Error("row.Scan() error(%v)", err)
}
}
return
}
func (d *Dao) TxUpdateTaskState(c context.Context, tx *xsql.Tx, state int, taskID int64) (rows int64, err error) {
res, err := tx.Exec(_updateStateSql, state, taskID)
if err != nil {
err = errors.WithStack(err)
return
}
rows, err = res.RowsAffected()
return
}
func (d *Dao) QueryTaskID(c context.Context, mid int64) (taskID int64, err error) {
row := d.db.QueryRow(c, _queryTaskIDSql, mid)
if err = row.Scan(&taskID); err != nil {
if err == sql.ErrNoRows {
err = nil
} else {
err = errors.WithStack(err)
log.Error("row.Scan() error(%v)", err)
}
}
return
}
func (d *Dao) DetailTask(c context.Context, taskID int64) (t *model.Task, err error) {
t = &model.Task{}
row := d.db.QueryRow(c, _selectByPrimaryID, taskID)
if err = row.Scan(&t.ID, &t.AdminID, &t.MID, &t.LogDate, &t.ContactEmail, &t.SourceType, &t.Platform, &t.State, &t.IsDeleted, &t.CTime, &t.MTime); err != nil {
err = errors.WithStack(err)
log.Error("rows.Scan error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,24 @@
package dao
import (
"context"
"github.com/pkg/errors"
xsql "go-common/library/database/sql"
)
const (
_addTaskLogSql = "INSERT INTO task_log (task_id, mid, build, platform, task_state, reason) VALUES ( ?, ?, ?, ?, ?, ? )"
)
func (d *Dao) TxAddTaskLog(c context.Context, tx *xsql.Tx, taskID int64, mid int64, build string, platform int, taskState int, reason string) (insertID int64, err error) {
res, err := tx.Exec(_addTaskLogSql, taskID, mid, build, platform, taskState, reason)
if err != nil {
err = errors.WithStack(err)
return
}
if insertID, err = res.LastInsertId(); err == nil {
insertID = int64(insertID)
}
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 = [
"http.go",
"task.go",
],
importpath = "go-common/app/interface/main/laser/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/laser/conf:go_default_library",
"//app/interface/main/laser/service: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,52 @@
package http
import (
"go-common/app/interface/main/laser/conf"
"go-common/app/interface/main/laser/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"net/http"
)
var (
svc *service.Service
authSvr *auth.Auth
)
// Init http server
func Init(c *conf.Config) {
// service
initService(c)
engine := bm.DefaultServer(c.BM)
// init outer router
outerRouter(engine)
if err := engine.Start(); err != nil {
log.Error("engine.Start error(%v)", err)
panic(err)
}
}
// service init
func initService(c *conf.Config) {
svc = service.New(c)
authSvr = auth.New(nil)
}
func outerRouter(e *bm.Engine) {
e.Ping(ping)
app := e.Group("/x/laser/app", authSvr.UserMobile)
{
app.GET("/query", queryTask)
app.POST("/update", updateTask)
}
}
// ping check server ok.
func ping(c *bm.Context) {
var err error
if err = svc.Ping(c); err != nil {
c.AbortWithStatus(http.StatusServiceUnavailable)
log.Error("laser-interface ping error(%v)", err)
}
}

View File

@@ -0,0 +1,80 @@
package http
import (
"strconv"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"strings"
)
func queryTask(c *bm.Context) {
params := c.Request.Form
var (
err error
mid int64
platform int
sourceType int
)
midStr, _ := c.Get("mid")
mid = midStr.(int64)
if mid <= 0 {
c.JSON(nil, ecode.CreativeNotLogin)
return
}
platformStr := params.Get("platform")
if platformStr == "android" {
platform = 2
} else {
if platform, err = strconv.Atoi(platformStr); err != nil || platform <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
}
sourceTypeStr := params.Get("source_type")
if sourceType, err = strconv.Atoi(sourceTypeStr); err != nil || sourceType <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
logDate, err := svc.QueryUndoneTaskLogdate(c, mid, platform, sourceType)
if err != nil {
c.JSON(nil, err)
return
}
value := make(map[string]interface{})
value["log_date"] = logDate
c.JSON(value, nil)
}
func updateTask(c *bm.Context) {
params := c.Request.Form
var (
err error
mid int64
build string
platform int
taskState int
reason string
)
midStr, _ := c.Get("mid")
mid = midStr.(int64)
if mid <= 0 {
c.JSON(nil, ecode.CreativeNotLogin)
return
}
build = params.Get("build")
platformStr := params.Get("platform")
taskStateStr := params.Get("task_state")
reason = params.Get("reason")
if strings.EqualFold("android", platformStr) {
platform = 2
} else if platform, err = strconv.Atoi(platformStr); err != nil || platform <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if taskState, err = strconv.Atoi(taskStateStr); err != nil || taskState <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, svc.UpdateTaskState(c, mid, build, platform, taskState, reason))
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"task.go",
"task_log.go",
],
importpath = "go-common/app/interface/main/laser/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//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,33 @@
package model
import (
xtime "go-common/library/time"
)
// Task is laser task
type Task struct {
ID int64 `json:"id"`
AdminID int64 `json:"admin_id"`
MID int64 `json:"mid"`
LogDate xtime.Time `json:"log_date"`
ContactEmail string `json:"contact_email"`
SourceType int `json:"source_type"`
Platform int `json:"platform"`
State int `json:"state"`
IsDeleted int `json:"is_deleted"`
CTime xtime.Time `json:"ctime"`
MTime xtime.Time `json:"mtime"`
}
const (
ALL_PLATFORM = iota
)
// TaskInfo is to set as value of memcache key(mid)
type TaskInfo struct {
MID int64
LogDate xtime.Time
SourceType int
Platform int
Empty bool
}

View File

@@ -0,0 +1,18 @@
package model
import (
xtime "go-common/library/time"
)
// TaskLog record the uploaded task details
type TaskLog struct {
ID int64 `json:"id"`
TaskID int64 `json:"task_id"`
MID int64 `json:"mid"`
Build string `json:"build"`
Platform int `json:"platform"`
TaskState int `json:"task_state"`
Reason string `json:"reason"`
CTime xtime.Time `json:"ctime"`
MTime xtime.Time `json:"mtime"`
}

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"mail.go",
"service.go",
"task.go",
],
importpath = "go-common/app/interface/main/laser/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/laser/conf:go_default_library",
"//app/interface/main/laser/dao:go_default_library",
"//app/interface/main/laser/model:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/stat/prom: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,39 @@
package service
import (
"context"
"fmt"
"go-common/library/log"
)
const (
ISO8601Date = "2006-01-02"
)
// SendEmail is send the finished Task info to reciever
func (s *Service) SendEmail(c context.Context, taskID int64) (err error) {
task, err := s.dao.DetailTask(c, taskID)
if err != nil {
log.Error("s.SendEmail() error(%v)", err)
return
}
createAt := task.CTime.Time().Format(ISO8601Date)
var sourceDesc string
if task.SourceType == 1 {
sourceDesc = "创作姬"
} else {
sourceDesc = "其他"
}
var appStr string
if task.Platform == 1 {
appStr = "IOS"
} else if task.Platform == 2 {
appStr = "Android"
}
date := task.LogDate.Time().Format(ISO8601Date)
subject := fmt.Sprintf(" %s 创建的日志上报完成通知", createAt)
body := fmt.Sprintf("你于%s创建的一条日志上报任务上报来源%s%s App端采集的日志文件日期%s指定MID%d现已上报完毕。", createAt, sourceDesc, appStr, date, task.MID)
err = s.dao.SendEmail(subject, task.ContactEmail, body)
return
}

View File

@@ -0,0 +1,55 @@
package service
import (
"context"
"go-common/app/interface/main/laser/conf"
"go-common/app/interface/main/laser/dao"
"go-common/library/log"
"go-common/library/stat/prom"
)
type Service struct {
conf *conf.Config
dao *dao.Dao
pCacheHit *prom.Prom
pCacheMiss *prom.Prom
missch chan func()
}
func New(c *conf.Config) (s *Service) {
s = &Service{
conf: c,
dao: dao.New(c),
pCacheHit: prom.CacheHit,
pCacheMiss: prom.CacheMiss,
missch: make(chan func(), 1024),
}
go s.cacheproc()
return
}
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
func (s *Service) Close() {
s.dao.Close()
}
// 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()
}
}

View File

@@ -0,0 +1,107 @@
package service
import (
"context"
"go-common/app/interface/main/laser/model"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
// QueryTaskState is query satisfied logDate from memcache if key exist,Otherwise query from db.
func (s *Service) QueryUndoneTaskLogdate(c context.Context, mid int64, platform int, sourceType int) (logDate int64, err error) {
// cache flag: cached to memcache only when query db.
cache := true
var v *model.TaskInfo
if v, err = s.dao.TaskInfoCache(c, mid); err != nil {
err = nil
cache = false
} else if v != nil {
// if memcache key exist
if v.Empty {
return
}
if logDateExist(v, sourceType, platform) {
logDate = v.LogDate.Time().Unix()
return
}
return
}
// if memcache key not exist , then query db.
v, err = s.dao.QueryUndoneTaskInfo(c, mid)
if err != nil {
return
}
if v != nil {
if logDateExist(v, sourceType, platform) {
logDate = v.LogDate.Time().Unix()
}
} else {
// if not found from db, new empty Instance and set Flag:Empty true.
v = &model.TaskInfo{
Empty: true,
}
}
if cache {
s.addCache(func() {
s.dao.AddTaskInfoCache(context.Background(), mid, v)
})
}
return
}
func logDateExist(t *model.TaskInfo, sourceType int, platform int) bool {
if sourceType == t.SourceType && (platform == t.Platform || platform == model.ALL_PLATFORM) {
return true
}
return false
}
// UpdateTaskState is update task set state = 1 ,insert taskLog to table task_log and remove memcache.
func (s *Service) UpdateTaskState(c context.Context, mid int64, build string, platform int, taskState int, reason string) (err error) {
// avoid err when remove the specified-mid task on laser-admin application.
taskID, err := s.dao.QueryTaskID(c, mid)
if err != nil {
log.Error("s.UpdateTaskState() error(%v)", err)
return
}
if taskID == 0 {
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran() error(%v)", err)
return
}
rows, err := s.dao.TxUpdateTaskState(c, tx, 1, taskID)
if err != nil || rows <= 0 {
tx.Rollback()
log.Error("s.UpdateTaskState() error(%v)", err)
return
}
err = s.addTaskLog(c, tx, taskID, mid, build, platform, taskState, reason)
if err != nil {
tx.Rollback()
log.Error("s.UpdateTaskState() error(%v)", err)
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit() error(%v)", err)
return
}
s.dao.RemoveTaskInfoCache(c, mid)
go s.SendEmail(context.Background(), taskID)
return
}
// addTaskLog is insert TaskLog to table task_log.
func (s *Service) addTaskLog(c context.Context, tx *xsql.Tx, taskID int64, mid int64, build string, platform int, taskState int, reason string) (err error) {
insertID, err := s.dao.TxAddTaskLog(c, tx, taskID, mid, build, platform, taskState, reason)
if err != nil || insertID <= 0 {
log.Error("s.UpdateTaskState() error(%v)", err)
return
}
return
}