add line webhook router

This commit is contained in:
Jay
2018-12-24 17:34:24 +08:00
parent 9d9fe262f4
commit 4726070ea5
19 changed files with 969 additions and 142 deletions
+72
View File
@@ -0,0 +1,72 @@
package apimsg
// ResObject -
type ResObject struct {
Status int
Obj interface{}
}
var objs = map[string]*ResObject{
"Success": &ResObject{
Status: 200,
Obj: map[string]string{
"message": "success",
},
},
"InternalError": &ResObject{
Status: 500,
Obj: map[string]string{
"message": "internal error",
},
},
"NotFound": &ResObject{
Status: 400,
Obj: map[string]string{
"message": "not found",
},
},
"DataFormat": &ResObject{
Status: 400,
Obj: map[string]string{
"message": "data format error",
},
},
"LoginFirst": &ResObject{
Status: 401,
Obj: map[string]string{
"message": "login first",
},
},
"Forbidden": &ResObject{
Status: 403,
Obj: map[string]string{
"message": "forbidden",
},
},
}
// GetRes -
func GetRes(name string, msg interface{}) *ResObject {
obj, ok := objs[name]
if !ok {
obj = objs["InternalError"]
}
resobj := &ResObject{}
resobj.Status = obj.Status
switch msg.(type) {
case string:
tmp := make(map[string]string)
tmp["message"] = msg.(string)
resobj.Obj = tmp
break
case map[string]interface{}:
case map[string]string:
resobj.Obj = msg
break
default:
resobj.Obj = obj.Obj
}
return resobj
}
+83
View File
@@ -1 +1,84 @@
package cmd
import (
"database/sql"
"errors"
"log"
"git.trj.tw/golang/mtgbot/models"
"git.trj.tw/golang/mtgbot/modules/schema"
)
// DBTool - run db deploy
func DBTool() {
db := models.NewDB()
defer db.Close()
if db == nil {
log.Fatal(errors.New("database object is nil"))
}
dbver, err := schema.ReadVersions()
if err != nil {
log.Fatal(err)
}
version := -1
vcExists := false
// check version_ctrl table exists
row := db.QueryRowx(`select exists(select 1 from "information_schema"."tables" where "table_schema" = $1 and "table_name" = $2) as exists`, "public", "version_ctrl")
err = row.Scan(&vcExists)
if err != nil && err != sql.ErrNoRows {
log.Fatal(err)
}
if vcExists {
row := db.QueryRowx(`select max(version) as version from "public"."version_ctrl"`)
err := row.Scan(&version)
if err != nil && err != sql.ErrNoRows {
log.Fatal(err)
}
}
log.Println("Database Schema Version is ", version)
var vers []schema.VersionInfo
for _, v := range dbver.Versions {
if v.Version > version {
vers = append(vers, v)
}
}
if len(vers) == 0 {
return
}
tx, err := db.Beginx()
if err != nil {
log.Fatal(err)
}
for _, v := range vers {
log.Printf("Run Version: %d, FileName: %s\n", v.Version, v.File)
query, err := schema.ReadSchema(v.File)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
// run schema file
_, err = tx.Exec(query)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
// insert version data
_, err = tx.Exec(`insert into "public"."version_ctrl" ("version", "str") values ($1, $2)`, v.Version, query)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
}
tx.Commit()
}
+41 -2
View File
@@ -1,7 +1,10 @@
package context
import "github.com/gin-gonic/gin"
import "github.com/gin-gonic/gin/binding"
import (
"git.trj.tw/golang/mtgbot/modules/apimsg"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
// Context - custom http context
type Context struct {
@@ -31,3 +34,39 @@ func (c *Context) BindData(i interface{}) error {
func (c *Context) CustomRes(status int, msg interface{}) {
c.AbortWithStatusJSON(status, msg)
}
// LoginFirst -
func (c *Context) LoginFirst(msg interface{}) {
obj := apimsg.GetRes("LoginFirst", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
// NotFound -
func (c *Context) NotFound(msg interface{}) {
obj := apimsg.GetRes("NotFound", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
// DataFormat -
func (c *Context) DataFormat(msg interface{}) {
obj := apimsg.GetRes("DataFormat", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
// Forbidden -
func (c *Context) Forbidden(msg interface{}) {
obj := apimsg.GetRes("Forbidden", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
// Success -
func (c *Context) Success(msg interface{}) {
obj := apimsg.GetRes("Success", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
// ServerError -
func (c *Context) ServerError(msg interface{}) {
obj := apimsg.GetRes("InternalError", msg)
c.AbortWithStatusJSON(obj.Status, obj.Obj)
}
+70
View File
@@ -0,0 +1,70 @@
package lineobj
import (
"encoding/json"
"fmt"
)
// SourceObject -
type SourceObject struct {
Type string `json:"type" cc:"type"`
UserID string `json:"userId" cc:"userId"`
GroupID string `json:"groupId" cc:"groupId"`
}
// EventObject -
type EventObject struct {
Source *SourceObject `json:"source" cc:"source"`
Type string `json:"type" cc:"type"`
Timestamp int64 `json:"timestamp" cc:"timestamp"`
ReplyToken string `json:"replyToken" cc:"replyToken"`
Message map[string]interface{} `json:"message" cc:"message"`
}
// HookEvent -
type HookEvent struct {
Events []*EventObject `json:"events"`
}
// ParseWebhookBody -
func ParseWebhookBody(b []byte) *HookEvent {
if len(b) == 0 {
return nil
}
evt := &HookEvent{}
err := json.Unmarshal(b, evt)
if err != nil {
return nil
}
return evt
}
// MessageEvent -
func MessageEvent(e *EventObject) {
switch e.Type {
case "message":
// TODO
break
default:
fmt.Printf("line webhook type not match (%v)", e.Type)
}
}
func messageType(e *EventObject) {
msg := e.Message
mtype, ok := msg["type"]
if !ok {
return
}
if t, ok := mtype.(string); ok {
switch t {
case "text":
// TODO
break
case "iamge":
// TODO
break
}
}
}
+44
View File
@@ -0,0 +1,44 @@
package schema
import (
"encoding/json"
"errors"
"fmt"
)
// DBVersion -
type DBVersion struct {
Versions []VersionInfo `json:"versions"`
Test []VersionInfo `json:"test"`
}
// VersionInfo -
type VersionInfo struct {
File string `json:"file"`
Version int `json:"version"`
}
// ReadVersions -
func ReadVersions() (dbver DBVersion, err error) {
f, err := Asset("schema/dbVersion.db")
if err != nil {
return dbver, err
}
err = json.Unmarshal(f, &dbver)
return
}
// ReadSchema -
func ReadSchema(name string) (q string, err error) {
if len(name) == 0 {
return "", errors.New("name is empty")
}
f, err := Asset(fmt.Sprintf("schema/%s", name))
if err != nil {
return "", err
}
q = string(f)
return
}