add line webhook router
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user