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,55 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["service_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/sms/conf:go_default_library",
"//app/service/main/sms/api:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"service.go",
"task.go",
"template.go",
],
importpath = "go-common/app/admin/main/sms/service",
tags = ["automanaged"],
deps = [
"//app/admin/main/sms/conf:go_default_library",
"//app/admin/main/sms/dao:go_default_library",
"//app/service/main/sms/api:go_default_library",
"//app/service/main/sms/model:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/time: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,43 @@
package service
import (
"context"
"sync"
"go-common/app/admin/main/sms/conf"
"go-common/app/admin/main/sms/dao"
"github.com/jinzhu/gorm"
)
// Service is service.
type Service struct {
c *conf.Config
dao *dao.Dao
wg sync.WaitGroup
db *gorm.DB
closed bool
}
// New is workflow-admin service implementation.
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
s.db = s.dao.DB
return s
}
// Ping check server ok.
func (s *Service) Ping(c context.Context) (err error) {
err = s.dao.Ping(c)
return
}
// Close consumer close.
func (s *Service) Close() {
s.closed = true
s.dao.Close()
s.wg.Wait()
}

View File

@@ -0,0 +1,61 @@
package service
import (
"context"
"flag"
"path/filepath"
"testing"
"go-common/app/admin/main/sms/conf"
pb "go-common/app/service/main/sms/api"
. "github.com/smartystreets/goconvey/convey"
)
var s *Service
func init() {
dir, _ := filepath.Abs("../cmd/sms-admin-test.toml")
flag.Set("conf", dir)
if err := conf.Init(); err != nil {
panic(err)
}
s = New(conf.Conf)
}
func TestAddTemplate(t *testing.T) {
Convey("add tpl", t, func() {
req := &pb.AddTemplateReq{
Tcode: "test",
Template: "test",
Stype: 2,
Submitter: "wj",
}
_, err := s.AddTemplate(context.TODO(), req)
t.Log(err)
})
}
func TestUpdateTemplate(t *testing.T) {
Convey("update tpl", t, func() {
req := &pb.UpdateTemplateReq{
Tcode: "test",
Template: "test",
Stype: 2,
Status: 1,
Submitter: "wj",
}
_, err := s.UpdateTemplate(context.TODO(), req)
So(err, ShouldNotBeNil)
})
}
func TestTemplateList(t *testing.T) {
Convey("tpl list", t, func() {
req := &pb.TemplateListReq{Pn: 1, Ps: 10}
res, err := s.TemplateList(context.TODO(), req)
So(err, ShouldBeNil)
So(res.Total, ShouldBeGreaterThan, 0)
So(res.List, ShouldNotBeEmpty)
})
}

View File

@@ -0,0 +1,170 @@
package service
import (
"context"
"os"
"strconv"
"strings"
pb "go-common/app/service/main/sms/api"
smsmdl "go-common/app/service/main/sms/model"
"go-common/library/ecode"
"go-common/library/log"
xtime "go-common/library/time"
)
const _tableTask = "sms_tasks"
func (s *Service) checkActTemplate(ctx context.Context, code string) (err error) {
tpl, err := s.templateByCode(ctx, code)
if err != nil {
return
}
if tpl == nil {
return ecode.SmsTemplateNotExist
}
if tpl.Stype != smsmdl.TypeActSms {
return ecode.SmsTemplateNotAct
}
return
}
// AddTask add task
func (s *Service) AddTask(ctx context.Context, req *pb.AddTaskReq) (res *pb.AddTaskReply, err error) {
if err = s.checkActTemplate(ctx, req.TemplateCode); err != nil {
return
}
t := &smsmdl.ModelTask{
Type: req.Type,
BusinessID: req.BusinessID,
TemplateCode: req.TemplateCode,
Desc: req.Desc,
FileName: req.FileName,
FilePath: req.FilePath,
SendTime: xtime.Time(req.SendTime),
Status: smsmdl.TaskStatusPrepared,
}
if err = s.db.Table(_tableTask).Create(t).Error; err != nil {
log.Error("s.AddTask(%+v) error(%v)", req, err)
}
return
}
// UpdateTask update task
func (s *Service) UpdateTask(ctx context.Context, req *pb.UpdateTaskReq) (res *pb.UpdateTaskReply, err error) {
if err = s.checkActTemplate(ctx, req.TemplateCode); err != nil {
return
}
data := map[string]interface{}{
"type": req.Type,
"business_id": req.BusinessID,
"template_code": req.TemplateCode,
"desc": req.Desc,
"file_name": req.FileName,
"file_path": req.FilePath,
"send_time": xtime.Time(req.SendTime),
}
if err = s.db.Table(_tableTask).Where("id=?", req.ID).Update(data).Error; err != nil {
log.Error("s.UpdateTask(%+v) error(%v)", req, err)
}
return
}
// DeleteTask delete task
func (s *Service) DeleteTask(ctx context.Context, req *pb.DeleteTaskReq) (res *pb.DeleteTaskReply, err error) {
if err = s.db.Table(_tableTask).Where("id=?", req.ID).Update("status", smsmdl.TaskStatusStop).Error; err != nil {
log.Error("s.DeleteTask(%+v) error(%v)", req, err)
}
return
}
// TaskInfo get task info
func (s *Service) TaskInfo(ctx context.Context, req *pb.TaskInfoReq) (res *pb.TaskInfoReply, err error) {
res = &pb.TaskInfoReply{Info: new(smsmdl.ModelTask)}
if err = s.db.Table(_tableTask).Where("id=?", req.ID).Find(&res.Info).Error; err != nil {
log.Error("s.TaskInfo(%+v) error(%v)", req, err)
return
}
tpl, err := s.templateByCode(ctx, res.Info.TemplateCode)
if err != nil || tpl == nil {
return
}
res.Info.TemplateCode = tpl.Code
res.Info.TemplateContent = tpl.Template
return
}
// TaskList get task list
func (s *Service) TaskList(ctx context.Context, req *pb.TaskListReq) (res *pb.TaskListReply, err error) {
res = &pb.TaskListReply{List: make([]*smsmdl.ModelTask, 0)}
start := (req.Pn - 1) * req.Ps
if err = s.db.Table(_tableTask).Order("id desc").Offset(start).Limit(req.Ps).Find(&res.List).Error; err != nil {
log.Error("s.TaskList(%d,%d) error(%v)", req.Pn, req.Ps, err)
return
}
if err = s.db.Table(_tableTask).Count(&res.Total).Error; err != nil {
log.Error("s.TaskList(%d,%d) count error(%v)", req.Pn, req.Ps, err)
return
}
return
}
// 上传说明:
// 前端是批量上传,会随机按内容长度切割文件进行分批上传,有可能会切断原始行内容
// 如果想在上传的时候同步判断文件格式,产生错误时需要忽略首行和末行
// CheckUploadFile checks uploaded content validation.
func (s *Service) CheckUploadFile(data []byte) (err error) {
var (
val int64
lineNum int
lines = strings.Split(string(data), "\n")
total = len(lines)
)
for _, line := range lines {
lineNum++
line = strings.Trim(line, " \r\t")
if line == "" {
continue
}
if val, err = strconv.ParseInt(line, 10, 64); err != nil {
log.Error("CheckUploadMid data(%s) error(%v)", line, err)
return ecode.PushUploadInvalidErr
}
if val <= 0 {
if lineNum == 1 || lineNum == total {
continue
}
log.Error("CheckUploadMid data(%s) error(%v)", line, err)
return ecode.PushUploadInvalidErr
}
}
return
}
// Upload add mids file.
func (s *Service) Upload(dir, path string, data []byte) (err error) {
if _, err = os.Stat(dir); err != nil {
if !os.IsNotExist(err) {
log.Error("os.IsNotExist(%s) error(%v)", dir, err)
return
}
if err = os.MkdirAll(dir, 0777); err != nil {
log.Error("os.MkdirAll(%s) error(%v)", dir, err)
return
}
}
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Error("s.Upload(%s) error(%v)", path, err)
return
}
if _, err = f.Write(data); err != nil {
log.Error("f.Write() error(%v)", err)
return
}
if err = f.Close(); err != nil {
log.Error("f.Close() error(%v)", err)
}
return
}

View File

@@ -0,0 +1,119 @@
package service
import (
"context"
pb "go-common/app/service/main/sms/api"
smsmdl "go-common/app/service/main/sms/model"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_tableTemplate = "sms_template_new"
_searchTypeCode = "code"
_searchTypeContent = "content"
)
func (s *Service) templateByID(ctx context.Context, id int64) (res *smsmdl.ModelTemplate, err error) {
res = new(smsmdl.ModelTemplate)
if err = s.db.Table(_tableTemplate).Where("id=?", id).First(&res).Error; err != nil {
res = nil
if err == ecode.NothingFound {
err = nil
return
}
log.Error("templateByID(%d) error(%v)", id, err)
return
}
return
}
func (s *Service) templateByCode(ctx context.Context, code string) (res *smsmdl.ModelTemplate, err error) {
res = new(smsmdl.ModelTemplate)
if err = s.db.Table(_tableTemplate).Where("code=?", code).First(&res).Error; err != nil {
res = nil
if err == ecode.NothingFound {
err = nil
return
}
log.Error("templateByCode(%s) error(%v)", code, err)
return
}
return
}
// AddTemplate add template
func (s *Service) AddTemplate(ctx context.Context, req *pb.AddTemplateReq) (res *pb.AddTemplateReply, err error) {
tpl, err := s.templateByCode(ctx, req.Tcode)
if err != nil {
return
}
if tpl != nil {
err = ecode.SmsTemplateCodeExist
return
}
t := &smsmdl.ModelTemplate{
Code: req.Tcode,
Template: req.Template,
Stype: req.Stype,
Status: smsmdl.TemplateStatusApprovel,
Submitter: req.Submitter,
}
if err = s.db.Table(_tableTemplate).Create(t).Error; err != nil {
log.Error("s.AddTemplate(%+v) error(%v)", req, err)
}
return
}
// UpdateTemplate update template
func (s *Service) UpdateTemplate(ctx context.Context, req *pb.UpdateTemplateReq) (res *pb.UpdateTemplateReply, err error) {
tpl, err := s.templateByID(ctx, req.ID)
if err != nil {
return
}
if tpl == nil {
err = ecode.SmsTemplateNotExist
return
}
if tpl.Code != req.Tcode {
var t *smsmdl.ModelTemplate
if t, err = s.templateByCode(ctx, req.Tcode); err != nil {
return
}
if t != nil {
err = ecode.SmsTemplateCodeExist
return
}
}
m := map[string]interface{}{
"code": req.Tcode,
"template": req.Template,
"stype": req.Stype,
"status": req.Status,
"submitter": req.Submitter,
}
if err = s.db.Table(_tableTemplate).Where("id=?", req.ID).Update(m).Error; err != nil {
log.Error("s.UpdateTemplate(%+v) error(%v)", req, err)
}
return
}
// TemplateList template list
func (s *Service) TemplateList(ctx context.Context, req *pb.TemplateListReq) (res *pb.TemplateListReply, err error) {
res = new(pb.TemplateListReply)
cond := "1=1"
if req.St == _searchTypeCode {
cond = "code like '%" + req.Sw + "%'"
} else if req.St == _searchTypeContent {
cond = "template like '%" + req.Sw + "%'"
}
start := (req.Pn - 1) * req.Ps
if err = s.db.Table(_tableTemplate).Where(cond).Order("id desc").Offset(start).Limit(req.Ps).Find(&res.List).Error; err != nil {
log.Error("s.TemplateList(%d,%d,%s,%s) error(%v)", req.Pn, req.Ps, req.St, req.Sw, err)
return
}
err = s.db.Table(_tableTemplate).Where(cond).Count(&res.Total).Error
return
}